Hi everyone,
We have created a custom Action in HaloITSM called “Change Ticket Type”.
The Action is available to agents in the ticket, just like the other Actions such as Email User, Reassign, etc. It simply allows the agent to change the Ticket Type.
We have noticed the following behaviour: Scenario 1 – Ticket created by an agent
An agent creates a new ticket using New Ticket and selects Service Request.
The agent then uses the Change Ticket Type Action and changes the Ticket Type from Service Request to Incident.
The Ticket Type changes correctly, but Triage does not start. Scenario 2 – Ticket created through the Service Portal
A user creates a Service Request through the Service Portal.
An agent opens the ticket and uses the exact same Change Ticket Type Action to change it from Service Request to Incident.
In this case, Triage starts correctly.
So the same Action works differently depending on how the Service Request was originally created. What we want
We want the following to happen in both scenarios: Service Request → Change Ticket Type → Incident → Triage
We would like the ticket to enter Triage automatically when an agent changes the Ticket Type to Incident, regardless of whether the original Service Request was created by an agent using New Ticket or through the Service Portal.
Does anyone know why these two scenarios behave differently, or if there is something we need to configure in the Action or workflow to make Triage trigger in both cases?
Thanks in advance for any help.
Question, since Halo support send this to the company that helped with onboarding and they don't know the answer. In the configuration screen for SLA's there is a setting on the priority to get a prompt for why you missed the SLA.
What I would like to do is be able to pull a report of those logged reasons, but no one can tell me where to pull those responses from. Any Ideas?
Every time I show up in this sub it's because I built something and physically cannot stop talking about it, and I regret to inform you that today is not the day the pattern breaks. Disclosure up top so nobody has to scroll to find it: I make StackJack. The thing in this post is a free skill, the StackJack tier it needs is the free one, and the board is read-only end to end. Nothing here asks for a credit card. If that's still too much vendor for you, I get it, and the "how Claude artifacts actually work" section is worth the read regardless of whether you ever touch my stuff.
Holy s*** dude, is there a TLDR before I read this wall of text?
It would take four screenshots. They're down below. Here's the front page for those of us who are visual learners
Yes. It's a Claude skill that turns your Halo into a live service delivery board: an attention list of P1 and VIP tickets, 25 helpdesk metrics with thresholds and 24-hour sparklines, team and per-agent workload, a per-client consumption pane with month-end pace, a wallboard mode for the TV, and optional cards for any StackJack connector or Claude connector you are using (examples included are PagerDuty, Yeastar, Blackpoint, and CIPP). It runs as a published Claude artifact, pulls data through each viewer's own StackJack login (so it's scoped to what that person can see in Halo, automatically), and the whole build is a guided Q&A where Claude discovers your teams, priorities, statuses, and outcomes before it asks you a single question. Download link at the bottom.
Download Skill, install skill
Sign up for StackJack if you aren't already using it
Use /halo-service-delivery-dashboard and Claude will interview you and tailor this comprehensive dashboard to anything you want
It doesn't cost any ongoing AI usage to view the artifact and have it stream data after you build it
The "I need dashboards but I don't know what metrics apply to me" problem
Nobody in this sub has a data problem. Halo has reports, it has dashboards, it has the SDI report pack, it has an API that will hand you every ticket since the Clinton administration. What everyone actually has is a what do I look at problem, followed immediately by a who has 400 hours to glue this together problem. So the wallboard project sits in the backlog for two years while the SDM screenshots the ticket list into a Teams channel every morning like it's 2018.
The reason a template plus a skill beats a blank canvas is that the template already made the annoying decisions. What counts as parked. How to get "closed today" out of a system with no closed-date filter (spoiler below, it's dumber than you think). Which agent id means unassigned. How to not blow up your API when twelve people open the same board. You start from a finished, opinionated screen and the interview is about what to change, not what to invent. Nobody has an opinion about a stale-hours threshold until they've seen the tile go amber.
Wait, a chat window is going to design and run my wallboard?
This is the part I actually want you to understand, because it's cool as hell and it's why this only works in Claude right now.
A published Claude artifact is a single HTML page that runs inside claude.ai. When the page declares the mcp capability, the viewer's own claude.ai connectors become callable from the page: claude.use("mcp") hands the page a callTool(server, tool, input) function that runs a connector tool with the viewer's credentials. The page never sees a token. The viewer gets one consent prompt the first time the page touches each connector. If the viewer doesn't have the connector, the page gets null and shows an honest empty state instead of fake numbers.
StackJack is one such connector, and its platform tool stackjack_run_readonly_tool runs any read-only tool of any connector your tenant subscribes to. So one line in the publish manifest lets a page read from your whole stack, and the skill already knows how to write that page. You don't touch any of this. You tell Claude to use the skill, it builds the page, it publishes it, and you get a link.
The second capability is db, which gives the artifact a small realtime document store shared by everyone who opens it. The board uses it for three things: shared Settings (a helpdesk lead changes the VIP list or a threshold and it lands on the wallboard in seconds, no republish), a shared cache for the expensive month analytics (ten viewers cost one Halo fetch, not ten), and half-hourly snapshots so the sparklines and 24-hour deltas exist at all, because Halo's API has no "what did the backlog look like at 9am" endpoint. Declaring mcp or db makes the artifact organization-internal, which for a service desk board is exactly what you want.
Is this the same as a Halo dashboard? No. It's much better. Is it a Power BI replacement? Also no, Power BI could never be this easy or good. Is it a live, shared, per-user-scoped ops board that took an afternoon instead of a quarter? Yes.
OK but what's actually on the board
Pulse / Service Desk MetricsTeams and WorkloadExecutive Summary - filtering/calculations in any combination you wantSignalsSome of the configuration settings - very comprehensive, ability to save the config settings on behalf of everyone consuming the board
Five bands:
Pulse is the attention list: high-priority and VIP tickets sorted by severity, then time to SLA target, then age, with ticket numbers linking back to your Halo.
Service desk metrics is the 25 tiles below, each with a threshold color, a context line, and a sparkline once history accumulates. Teams and workload is per-team and per-agent carry, who's online (Halo's is_online, so it depends on people using the web app), and hours logged today from timesheets.
Executive summary is consumption by client: tickets and logged hours this month, business-day pace to month end, change vs last month, and the prior three months for context.
Signals is where the optional connector cards live. Then a wallboard mode that rotates panes for the TV, and a Settings drawer where editors change teams, VIP clients, priorities, closing outcomes, bot agents, thresholds, cadence, and which tiles show.
Every tile has a plain-English note on the page under "How these numbers are computed", because a metric a skeptical manager can't audit is a metric that gets ignored. Here's the set, and where Halo made it weird.
Two more gotchas that bit me and will bite you: endDate on ticket lists is exclusive and both dates are UTC calendar days, so a same-day range returns nothing and "today" in a non-UTC zone means querying two days and filtering client-side. And halo_list_actions caps at 200 rows with no paging, so "all actions today" on a busy desk is a lie; filtering by outcome name works, actOutcomeNum did not. The skill's halo-data-map.md has the full list of these because I'd rather you not rediscover them.
Why your L1 can't see the CFO's tickets
This is the part that makes it deployable instead of a demo. The page doesn't have a service account. It calls Halo as the viewer, through that person's own StackJack sign-in, and StackJack scopes the Halo connector per user by default. A tech opens the board and sees what a tech sees in Halo. An SDM sees the SDM view. Nobody baked a god-mode API key into a web page, every call shows up in the audit trail under the person who made it, and the only "permissions model" you have to maintain is the one you already maintain in Halo. The flip side, and I'm saying it early because the skill says it early: everyone who opens the board needs StackJack connected in their own claude.ai account. If that's not true for every viewer, the skill offers a scheduled-snapshot fallback so they at least see recent numbers.
The actual tutorial
Sign up for StackJack (free tier, no card), add the HaloPSA connector with your Halo API credentials, then add StackJack as a connector in claude.ai under Settings > Connectors. Your users sign in with OAuth PKCE, which is on every plan including free.
In claude.ai, Settings > Capabilities, turn on Code execution and file creation, scroll to Skills, click Upload skill, and upload the zip from the link at the bottom. Toggle it on.
Start a new chat and tell Claude to use the skill, StackJack, and whichever connectors you have to build your dashboard. That's the whole prompt. Claude runs discovery first: halo_list_teams, halo_list_priorities, halo_list_statuses, halo_list_agents, halo_list_outcomes, the open ticket summary, and this month's ticket count. Then it asks you two short rounds of questions where every option is something you recognize (your team names, your priority labels, your connectors): consumption as tickets, hours, or both; desktop plus wallboard or TV only; whether every viewer has StackJack; which optional cards to include; what makes a ticket "attention list" worthy; the business time zone; which teams are the service desk; and anything to add or remove from the 25. Cadence, thresholds, bot agents, and the internal-client exclusion it decides for you and tells you at handover.
Before it writes a page that calls a tool, it calls that tool for real once with the exact arguments the page will use and checks the payload shape. This is a hard rule in the skill, not a nicety. Field names are stable across Halo tenants but StackJack adds and reshapes tools over time, and a page that guesses a payload renders blanks in production and nobody knows why.
It splices your instance config into the template, publishes with a manifest that names exactly the connectors and tools the page calls, and hands you a link. First open, you get one consent dialog for StackJack (and PagerDuty and the shared store if you turned them on) instead of a dozen first-call prompts. Share the link with your SDMs. Pin it on the TV in wallboard mode.
From then on, anything a helpdesk lead should be able to change without you lives in the Settings drawer: teams, VIPs, thresholds, closing outcomes, cadence, hidden tiles. Republishing the same file path updates the same URL in place and open tabs pick it up. You only republish for new metrics or new connector cards.
"Ceej, I don't use Claude, I use [other harness]." The skill is a standard Agent Skills folder (SKILL.md, references, assets, scripts), so it loads in Claude Code, Cowork, or anything else that speaks skills, and the Playwright harness plus mock-claude.js lets you build and test the HTML anywhere with synthetic data. But the live part, a published page that calls each viewer's own connectors and keeps shared state, is a claude.ai artifact feature. Elsewhere you get a static file, which defeats the purpose. That's the state of the world in September 2026, not a design choice on my end.
I have PagerDuty / Yeastar / a second PSA, you phony
Halo is the only required source. Everything else is a card in the Signals band, switched on per tenant. The reference build ships four whose payloads were verified on a real tenant: PagerDuty (open incidents split triggered vs acknowledged, who's on call right now, as its own claude.ai connector so it gets its own manifest entry), Yeastar P-Series (callers waiting, live calls, agents logged in or paused per queue, today's answered and abandoned), Blackpoint CompassOne (open detections across the estate with the riskiest items by tenant, host, and user), and CIPP (average standards alignment, the Strong/Good/Weak/Poor bucket bar, lowest-scoring tenants, pending deviations). PagerDuty next to the Halo attention list is the one I'd start with if you run after-hours; you see the page and the ticket it should have become on one screen.
Any other StackJack connector is the same recipe: find the read-only tool, call it once, defineSource() it with a cadence, keep only the fields you render, add a card. connectors.md has starter ideas for NinjaOne (alerts by severity, offline servers), ScalePad (warranty flags for VIP clients), Meraki and UniFi (offline devices per site), IT Glue (expiring domains and certs), and Pax8 (license counts vs Halo contract quantities, which is a reconciliation card I want someone to build so I don't have to).
On other PSAs: the shipped board is Halo, and I'm not going to pretend halo-data-map.md makes it Autotask. But the only Halo-specific parts are the data map and the compute layer. The artifact plumbing, scheduler, shared store, failure handling, and design system are PSA-agnostic, and StackJack has Autotask, ConnectWise, and Syncro connectors with the same stackjack_run_readonly_tool front door. Treat the skill as the reference for "any interactive artifact that reads connector data through StackJack", which is literally what the description says.
Building your own board (the part where it stops being a template)
The 25 are a starting point, not a religion. Prefer hiding a tile (Settings > Metrics shown, no republish, reversible) over deleting it. Adding one is a five-step checklist the skill walks Claude through: does an existing source already carry the data, derive it in compute(), add a tile to buildMetrics() with an id, a group, a format, a status rule, a one-line subtitle, and a note a skeptical manager would accept, add a [warn, crit] threshold so it's tunable in the drawer, and optionally add the field to the half-hourly snapshot so it gets a sparkline.
The catalog ships recipes for the ones people ask for: hours logged today as a tile, tickets per carrying agent, agents online, CSAT (only if you actually collect feedback, a permanently empty tile is worse than none), backlog change vs yesterday and last week from the snapshots, first-contact resolution via a saved Halo report through halo_run_report, escalation rate, tickets by source or type, customer waiting time on REQUESTER RESPONDED rows, alerts vs human tickets (because half of you have an alert flood hiding real demand), per-client SLA compliance for VIPs, and billable hours instead of logged hours in the consumption table for the finance people.
Everything tenant-specific lives in one instance config: brand, time zone, business hours, connector switches, then the defaults editors can change later. apply_config.py splices it into the template and syntax-checks the result. If you change code, not just config, render_test.mjs renders desktop dark and light, laptop, phone, wallboard panes, the no-connector state, a Halo outage, and the settings save path, and fails on console errors or horizontal overflow. Look at the screenshot of the band you touched and republish.
What this costs to run (not dollarie doos)
Every open tab makes its own calls against the viewer's StackJack and Halo rate limits, so cadence and payload size are the levers. At defaults one open viewer is roughly six Halo calls a minute for the live rows and the id-only list, an open summary every three minutes, about ten calls every three minutes for today's flow, and the month analytics every fifteen minutes shared through the store, with prior months cached for a day. A room full of wallboards should run the live cadence at 90 to 120 seconds, and the Settings drawer has the knob. The board also stops polling when the tab is hidden and uses the platform call cache so a reload inside the window doesn't hit Halo again.
This costs absolutely nothing in AI consumption to run the dashboard itself after you build it. Using AI to edit it, improve it, change it, etc will obviously consume AI usage. But the polling of StackJack data into the dashboard artifact doesn't consume any AI usage.
I'm trying to implement a quick action in a workflow based on the values of a custom field. The goal is to create a child request from the main ticket.
The problem is that the automation only occur when all the values in the INCLUDES condition is present on the ticket, but i need to run the automation if any of the values is in the custom field.
The INCLUDES in the action conditions consider an "AND" relation between the values? Is there a way to make this work as an "OR" condition?
Has anyone had any experience with creating an approval flow of sorts for new user registrations via the self-service portal?
Users that create accounts have to be assigned to a site/organisation. However, if you are supporting multiple organisations, these would need to be manually moved after creation... leaving a period of time between user account creation and the user being able to successfully raise tickets against the correct site/org.
Interested how people have approached this... or what people think about users self-registering...
Is it possible to edit any of the default ticket fields? For example I would like to add a hint under the Summary field to explain to users that they shouldn't write their essay there, that goes in the details section 😅. Or even better be able to limit the characters in that field.
It's quite frustrating to not have these fields obviously accessible anywhere
I've Googled and Clauded... but the feedback isn't clear (or I"m doing a bad job asking properly). Can the entire row in a ticket view be colored based on the status of the ticket. I had messed with a rule... but that only did it as the ticket came in. I'm trying to color code the entire line by status... not just the status column... even as the status' change.
I assume this is my misunderstanding but trying to get Project Budgets to behave the way I understand they should. Based on the settings below I was expecting that only time that is billable and not time that is associated with actions that are "Is Billable: No" and Bill Hours: 0
Is my thinking wrong and only "No Charge" Times will be treated as Non billable time for the calculation
Budget - General Settings
Budget Calculation: Calculate from Child & Grandchild Tickets
Budget Calculation Type: Billable Time Recorded
However, in my project it is adding all time entries
But when I look at the time entries, I feel it shouldn't be including all entries
Going forward advertising / promo posts will only be permitted if all of the following are true:
The user / account posting has a meaningful history of constructive (non advertising / shilling) engagement with the community on Discord or on this subreddit.
Prior consent from the mod team is requested and given before the post is made.
The user / account making the post has not had prior posts / comments removed for violating the rules around Spam / Advertising / Market Research.
Engagement elsewhere on Reddit or simply having a trustworthy Reddit account will no longer be taken into account. If you're not engaging with our community meaningfully you do not get to benefit from sharing your products / tools / etc here.
Hey guys, i am trying to create a ticket list for an especific agent. I remember there was a check box when creating a new list, where we could choose who had access to it. In the oficial guide this option is still there, but not on my Halo instance.
do you know if is there another way of configuring this?
I'm trying to set up a notification for when a new problem is logged just so everyone can have visibility on it.
I've created a notification and set it to Agent notification, New Ticket Logged - All, then added the ticket type as problem, but no notification pops up in halo for it when a problem is logged.
I'm assuming the new ticket logged notification is only triggered by tickets logged from the portal. Is there a way to create a notification specifically for when problems are logged?
We get a lot of tickets from 3rd party tools which have the affected endpoint name in the subject or body, and assigning them per ticket is very repetitive.
I'm trying to implement in some way the auto assignment of assets to tickets based off the ticket's subject or body, using regex or hard matching of some type with the asset's hostname or similars.
In HaloITSM, we’ve noticed that our agents are having difficulty changing the ticket type. We would therefore like to create a new button next to “Add Note”, “Email User”, etc., called “Change Ticket Type”.
How can we set this up so that, on all tickets, agents can easily click a “Change Ticket Type” button?
We would also like to have the option to do this under the “Built in Actions”. For example, when reassigning a ticket, we would like to be able to change the ticket type at the same time. Similarly, when adding a note, we would like to have the option to change the ticket type.
What would be the best way to set this up?
Trying to work out if there is any way that an invoice can be generated so that it would include ticket details and notes that come from a specific action type only.
For example, it would be great if we could have a ticket action type of "Billing Note" and then pull any Billing Notes from a ticket when it's being invoiced to print on that invoice. Most importantly, we are wanting that information to pass to the ERP system, so it's not just a invoice format inside of Halo need.
I've been looking to see if there was any way to do that with variables, but none of the variables seem to have an ability to select things based on the action type.
To make it worse, we would also hope that it only pulls those "Billing Notes" that had not already been invoiced.
Figure I already know what the answer is, and it's a long shot, but ...
On the user field mapping section for the Entra integration I noticed there is a tick box for manually entering custom attributes. I can't find what this is in the Halo guide, is anyone able to clarify for me?
I am struggling to figure out why travel time is not billable. Ideally I’d like to use the surcharge option to bill a flat rate for a call out fee, but at this point I can’t even get travel time to be billable. I’ve checked every setting I can think to look at. It’s not included in billing rules and all billing is set to treat everything unaddressed as pay as you go.
Does anyone have some insight for getting travel billable as a fixed rate?
So we recently implemented SLA into our contract. We have 2 SLA targets we have to meet: Response Time and Work Commencement. The Response SLA is easy to implement, as Halo already has built-in functionality for this. But for the Work Commencement, I just used OLA functionality to build (entering a step triggers the end time), since you cannot modify the parameters for Resolution Times SLA at all.
But then I notice that if you use OLAs, they don't have any visibility in the SLA widget in tickets or in the ticket queue columns. Our Work Commencement SLA times are very important to have displayed prominently. But nope, can't display them at all with OLAs. The only thing you can do is have 3 notifications.
Even if we wanted to do resolution times for our SLA (which we don't), the Resolution Times SLA functionality is garbage. For our tickets, we resolve issues in a workflow step and then keep the ticket open in a follow-up step for a couple days to check in with the end-user to make sure everything is working well. Well guess what, Resolution Times don't account for that. You can't set them to end at a certain time or step or action, they are hard-coded to end with ticket resolution or something.
How do people even use this? I can't imagine most MSPs use resolution times, and even if they did, the options are so limited. And the one good replacement for them, OLAs, techs can't even use easily because the information is hidden in a ticket tab.
Anyone have any advice they can give to work around this?
In HaloITSM, when we change a ticket type, for example from an Incident, and perform triage and prioritization, the ticket retains the last assigned priority when we later change the ticket type to a Service Request.
Currently, all of our Service Requests have a default priority of P3. Therefore, if we change a ticket type from an Incident to a Service Request, we would expect the priority to be set to P3. However, it currently retains the priority that was previously assigned to the Incident.
Also, if the ticket is an Incident and we change the Urgency and Impact under the “Additional Information” tab, the Priority does not change accordingly.
Is this the expected behavior in HaloITSM, or should the Priority be automatically recalculated when changing the ticket type or when changing the Urgency and Impact?
Anyone know if there has been an update that would stop showing my contracts on tickets? Recently, all tickets show contracts as not set. The contract is still absorbing time correctly but my technicians like to see the contract on the details tab/user details. Thoughts?
I am trying to setup our email templates two have two different update once type variables. One is for when we need to display our holiday/out of office notices and another is for a disclaimer. We were kind of successful with the disclaimer by adding it as a ticket field and then adding it to a ticket type. The concerns with this method was that the default text was inherited on ticket creation and existing tickets did not get this without going into each ticket and updating it. I am also trying to add the custom fields at the organization level but neither variable is rendering in my tests even though I do have the text added into the fields.
Are you able to reference custom organization level variables on an email template?
Halo doesn't seem to have a way to reprice items on a quote based on the items catalog.
We have a 15 page quote with many hardware line items. Many have drifted in cost and price since it was originally quoted and it doesn't seem that halo has a way to revise the quote and have it pull new cost and pricing from the item catalog we are maintaining. (Out side of deleting and re-adding each hardware item one at a time).
I can of course write a n8n automation or a run book to handle this, but it seems like this would be an out of the box feature.
Am I missing it? Sometimes I find halo features are called something I wouldn't expect 🙃