Halo Ticket Namer Setup Guide
Install and configure the open-source Halo Ticket Namer service so new HaloPSA tickets get cleaner summaries and consistent category_1 values.
Prerequisites
- Admin access to your HaloPSA tenant
- A server, VM, or container host that can receive Halo webhooks
- Node.js 18+ or Docker
- An OpenAI API key
halo-ticket-namer is a small open-source utility for MSP teams using HaloPSA. It listens for new-ticket webhooks, rewrites the subject into something a human can actually scan, and maps the ticket into a valid category_1 value.
That matters more than it sounds. Bad subjects make triage slower, queue views noisier, and reporting worse. If every inbound email lands as help or printer issue please call, your board becomes hard to manage fast. This tool fixes that at the point of intake.
If you want the bigger picture on why this kind of cleanup matters, read 5 Ways AI is Transforming MSPs. If you're already auto-creating tickets from security tooling, pair this with SonicWall's PSA integration with HaloPSA so the ticket arrives automatically and arrives with a usable title.
What the tool does
When Halo creates a new ticket, the webhook sends the payload to halo-ticket-namer. The service reads the ticket context, applies your naming rules, and updates two fields:
- the ticket summary
category_1
You stay in control of the output. The project uses:
RULES.mdfor naming logic and examplescategories.jsonfor the allowed category list
That keeps the automation constrained. The model is not inventing random categories or writing novels into the subject line. It is choosing from the categories you define and following the patterns you give it.
Before you start
Plan for three things before you deploy it:
- A reachable webhook endpoint. Halo needs to call your service from the public internet or through a secure tunnel.
- A category list you actually want. Bad categories in
categories.jsoncreate bad outputs. - A few real ticket examples. Good examples in
RULES.mdmake the naming far more consistent.
Recommended naming pattern:
[System/App] - [Short action-oriented problem]
Example:
Outlook - Unable to send emailQuickBooks - Multi-user mode not availablePrinter - Scan to email failing
Step 1: Clone the repository and install dependencies
Repository:
https://github.com/megalath/halo-ticket-namer
Clone it to the host where you want the service to run:
git clone https://github.com/megalath/halo-ticket-namer.git
cd halo-ticket-namer
npm install
If you prefer Docker, clone the repo anyway so you can edit RULES.md, categories.json, and .env locally before building or running the container.
Step 2: Create your environment file
Copy the sample environment file:
cp .env.example .env
Then set the required values:
HALO_BASE_URL=https://yourcompany.halopsa.com
HALO_AUTH_URL=https://yourcompany.halopsa.com/auth/token
HALO_CLIENT_ID=your-client-id
HALO_CLIENT_SECRET=your-client-secret
OPENAI_API_KEY=sk-...
WEBHOOK_SECRET=a-random-secret-string
PORT=3000
LOG_LEVEL=info
What each variable does
- HALO_BASE_URL: your HaloPSA tenant URL
- HALO_AUTH_URL: Halo auth endpoint used to request access tokens
- HALO_CLIENT_ID / HALO_CLIENT_SECRET: credentials from the Halo API application you create in the next step
- OPENAI_API_KEY: used to generate cleaner ticket summaries and category decisions
- WEBHOOK_SECRET: shared secret between Halo and this service
- PORT: local service port
- LOG_LEVEL: logging verbosity;
infois a good default
Use a long random WEBHOOK_SECRET. Do not reuse another app secret, and do not commit .env into source control.
Step 3: Create a Halo API application
In HaloPSA:
- Go to Configuration → Integrations → Halo API
- Create a new API application
- Copy the generated Client ID and Client Secret
- Grant the app permission to read and update tickets
You do not need to overcomplicate the permission set. The service needs enough access to read the inbound ticket and update the subject/category fields. If your Halo permissions are locked down heavily, start with the minimum required scope and test against a non-critical queue first.
Sanity check the auth URL
Most Halo tenants use an auth URL that looks like this:
https://yourcompany.halopsa.com/auth/token
If your tenant uses a different host pattern, use the working auth endpoint from your existing Halo integrations. A wrong auth URL is one of the fastest ways to waste an hour on a setup that otherwise looks correct.
Step 4: Create the Halo webhook
In HaloPSA:
- Go to Configuration → Integrations → Webhooks
- Create a webhook for New Ticket Created
- Set the URL to your deployed endpoint, for example:
https://your-server.example.com/webhook
- Set the auth token to the same value as
WEBHOOK_SECRET - Save the webhook
If you are testing locally, use a secure tunnel so Halo can reach your machine. Just make sure the public URL stays stable long enough to complete setup and validation.
Step 5: Define your naming rules and allowed categories
This is the step that decides whether the output is useful.
Configure RULES.md
Your rules file should be short, concrete, and example-heavy. The model follows examples closely, so give it realistic patterns from your own service desk.
Good guidance looks like this:
- Use
[System/App] - [Issue] - Prefer the affected application over vague user wording
- Keep the output under one line
- Remove filler like
please help,urgent, or all-caps email subjects - Normalize synonyms into your team's preferred vocabulary
Bad guidance is vague, like "make titles better." Be specific.
Configure categories.json
Only include categories that already exist in Halo as valid category_1 values. Exact spelling matters.
Example categories:
[
"Email & Collaboration",
"Line of Business Apps",
"Printing",
"Network",
"Workstation",
"Security"
]
If the tool writes a category name Halo does not recognize, the update will fail or produce inconsistent data. Keep this list tight.
Step 6: Start the service
For local development:
npm run dev
For a production-style Node run:
npm run build
npm start
For Docker:
docker compose up -d
Once the service is running, verify the health endpoint:
curl http://localhost:3000/health
Expected response:
{"ok": true}
If you do not get a healthy response, do not move on to webhook testing yet. Fix local startup first.
Step 7: Test with a real ticket
Create a low-risk test ticket in Halo with a messy subject such as:
user cant print to front office copier please call
Then confirm:
- Halo sent the webhook successfully
- The service logs show a clean request/response path
- The ticket summary was updated to a readable format
category_1changed to one of your allowed values
A good first-pass result is not perfection. You are looking for consistency and guardrails. After two or three test tickets, refine RULES.md with examples from anything the model handled awkwardly.
Troubleshooting
The webhook never arrives
Start with reachability:
- confirm the webhook URL is public and correct
- confirm Halo is using the
New Ticket Createdevent - confirm your firewall or reverse proxy is allowing the request through
- confirm the token in Halo matches
WEBHOOK_SECRET
If you are tunneling a local service, remember that temporary tunnel URLs expire or change.
Authentication to Halo fails
Usually one of these is wrong:
HALO_BASE_URLHALO_AUTH_URLHALO_CLIENT_IDHALO_CLIENT_SECRET
Copy them again carefully. Halo auth problems are usually configuration mistakes, not code problems.
Titles improve, but categories are inconsistent
That is usually a categories.json or RULES.md issue, not an infrastructure issue. Tighten the allowed categories, remove overlapping labels, and add clearer examples that map common ticket types to the exact category you want.
The output is too verbose
Add a rule that explicitly caps title length and forbids extra context unless it materially clarifies the issue.
For example:
- Good:
Outlook - Unable to send email - Too long:
Outlook desktop on reception PC cannot send outbound messages after password reset
The tool keeps choosing the wrong system name
Feed it better examples from your own environment. If your users say "email" but your team wants every Microsoft 365 mail issue labeled as Outlook, say that directly in RULES.md and include examples.
Security and operations notes
Treat this like any other service that touches ticket data:
- store secrets in environment variables, not in the repo
- rotate
WEBHOOK_SECRETif it is ever exposed - avoid logging full ticket payloads in production
- keep the host patched if you are exposing it publicly
- test rule changes on a few tickets before rolling them into broad production use
If you want to see why noisy intake data quietly hurts margin later, MSP revenue leakage is the downstream version of this same problem.
When to use this tool vs build it into a broader workflow
Use Halo Ticket Namer when you need a lightweight way to standardize inbound ticket naming now.
Move to a broader workflow when you also want to:
- route tickets across multiple automations
- combine intake cleanup with alert-driven ticket creation
- feed normalized ticket data into reporting, quoting, or profitability workflows
- manage multiple PSA or distributor integrations from one system
That is the difference between a useful utility and an operating layer. The utility is still worth using. Just be clear on what it is supposed to solve.