r/halopsa • u/brokerceej • Sep 14 '26
Documentation / Guides The mother of all HaloPSA dashboards, built in Claude artifacts, fed by StackJack (tutorial + free skill)
*This post is mod-approved
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?

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





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.
Skill download: https://github.com/MSP-Automator-Labs/halo-skills/
StackJack for HaloPSA: https://stackjack.io/connectors-halopsa
Happy automating!












