An n8n community node for integrating with HaloPSA API.
This repo uses pnpm with a committed lockfile and supply-chain controls in pnpm-workspace.yaml (see SECURITY.md). Development requires Node.js 22.22.3+ (CI and dependency engines). After clone:
corepack enable && corepack prepare pnpm@10.19.0 --activate
pnpm install --frozen-lockfile
pnpm run audit:supply-chain
pnpm run buildUse pnpm only for installs in this repo. With Corepack enabled, npm install and yarn install are rejected. Do not commit package-lock.json or yarn.lock (see SECURITY.md).
Unit tests (no HaloPSA credentials required):
pnpm testLive n8n preview — runs n8n at http://localhost:5678 with this node linked for hot reload:
pnpm run devUse Node.js 22 LTS (nvm use reads .nvmrc). Node 23+ is not supported by n8n’s native dependencies.
First run takes several minutes. n8n-node dev downloads n8n via npx into ~/.n8n-node-cli. You will see many npm warn lines about peer dependencies — that is normal. Wait until the n8n panel shows:
Editor is now accessible via: http://localhost:5678
Do not stop the process during the install. If you see Shutting down gracefully with exit code 1, you likely interrupted it with Ctrl+C before n8n finished starting.
Prefer pnpm run dev over a globally installed n8n-node so the CLI version matches this repo.
Configure HaloPSA OAuth credentials in the n8n UI, then test Tickets → Get Many with filters and Return All enabled.
Open http://localhost:5678 (not 127.0.0.1 or a LAN IP). pnpm run dev sets N8N_SECURE_COOKIE=false for local HTTP so Safari and other browsers can sign in. To keep secure cookies enabled, set N8N_SECURE_COOKIE=true yourself and use HTTPS.
If the node does not appear after changes:
rm -rf ~/.n8n-node-cli/.n8n/custom
pnpm run devAlready running n8n elsewhere (Docker, etc.):
pnpm run build
pnpm run dev:externalSet N8N_DEV_RELOAD=true and point your n8n instance’s custom extensions folder at ~/.n8n-node-cli/.n8n/custom (or symlink this repo into your instance’s custom nodes directory).
Use pnpm run watch for TypeScript watch mode only (no n8n).
Smoke test against a live HaloPSA instance (validates the tickets getAll filter + bulk-fetch query shape):
cp .env.example .env # fill in HALO_BASE_URL, HALO_CLIENT_ID, HALO_CLIENT_SECRET
pnpm test:smokeOptional: HALO_REQUESTTYPE_ID, HALO_OPEN_ONLY (see .env.example).
Same as pnpm run dev above. Requires Node.js 22.22.3+ (22.x LTS recommended).
Follow the installation guide in the n8n community nodes documentation.
npm install n8n-nodes-halopsacomplete- HaloPSA instance with API access
- OAuth 2.0 Client ID and Client Secret from HaloPSA
- Your HaloPSA base URL (e.g., https://your-domain.halopsa.com)
- Log into your HaloPSA instance
- Navigate to Configuration > Integrations > HaloPSA API
- Create a new OAuth 2.0 Client Application
- Set the Grant Type to "Client Credentials"
- Configure the appropriate scopes (recommend "all" for full access)
- Note down the Client ID and Client Secret for use in n8n
- Base API URL: Your HaloPSA instance URL (e.g., https://your-domain.halopsa.com)
- Client ID: OAuth 2.0 Client ID from HaloPSA
- Client Secret: OAuth 2.0 Client Secret from HaloPSA
- Scope: OAuth 2.0 scope (default: "all" for full API access)
Operations that support Filters also expose Filters (JSON) for runtime values (e.g. {"client_id": {{ $json.client_id }}}). JSON keys override the same keys from the UI Filters collection.
Get by ID on Tickets, Users, Assets, Projects, and Ticket Statuses also support Options (JSON) with the same override behavior.
Use the JSON fields when driving values from webhooks, upstream nodes, or expressions; use the UI collections for static values.
Return All on list operations fetches up to 1000 rows in a single request, then continues with paginated requests (100 per page) when more records exist.
Receive real-time webhook notifications from HaloPSA for ticket events:
- New Ticket Logged — New ticket created
- Ticket Updated by User — User updated a ticket
- Closed — Ticket closed
- 1st SLA Warning / 2nd SLA Warning — SLA breach warnings
- Ticket Deadline — Ticket reached its deadline
- Ticket Status Changed — Status changed
- Ticket Deleted — Ticket deleted
The trigger creates and manages webhooks in HaloPSA (subscription and cleanup).
API paths not listed above can be called with Custom API Call. swagger.json at the repo root is the OpenAPI reference for discovering endpoints and payloads.
MIT