Kaseya VSA → Breeze
Kaseya VSA migrations are dominated by two facts: Agent Procedures do not port (they are proprietary step lists, like Automate scripts), and the machine-group naming model is unlike anything else. Device and org data export cleanly through the REST API.
This page covers VSA 9 (on-premises and classic SaaS) and VSA X where the concepts differ.
Read Migrating to Breeze first.
Hierarchy Mapping
Section titled “Hierarchy Mapping”Kaseya’s identity for a machine is machineName.groupName.orgName — the machine group is embedded in the agent’s identity, which is why re-organising machines in VSA is painful and why migration is a good moment to fix your structure.
| Kaseya VSA | Breeze | Notes |
|---|---|---|
| VSA instance | Partner | |
| Organization | Organization | Direct match. |
| Machine Group | Site | Machine groups are usually locations or departments. Nested subgroups (hq.acme) flatten to one site each. |
| View / filter | Device Group | VSA Views map to Breeze dynamic device groups. |
| Agent | Device |
Phase 0 — Export from VSA
Section titled “Phase 0 — Export from VSA”VSA’s REST API is at https://<your-vsa>/api/v1.0. Authentication is a two-step token exchange using a Base64 Basic header built from your username and a SHA-256 hash of the password concatenated with a random string — awkward enough that most people generate the token once from the VSA UI (System → User Security → Users → REST API) and paste it.
-
Export the org → machine group tree:
Terminal window AUTH="Authorization: Bearer $VSA_TOKEN"curl -sf -H "$AUTH" "https://$VSA/api/v1.0/system/orgs?\$top=1000" \| jq -r '.Result[] | [.OrgId, .OrgName] | @tsv' > vsa-orgs.tsvcurl -sf -H "$AUTH" "https://$VSA/api/v1.0/system/machinegroups?\$top=5000" \| jq -r '.Result[] | [.OrgName, .MachineGroupName] | @csv' > tree.csvsed -i '1i organization,site' tree.csvFeed
tree.csvto Recipe 1. -
Export agents — your reconciliation checklist:
Terminal window curl -sf -H "$AUTH" "https://$VSA/api/v1.0/assetmgmt/agents?\$top=10000" \| jq -r '.Result[] | [.OrgName, .GroupName, .ComputerName,.OSName, .LastCheckInTime, .Online] | @tsv' > vsa-agents.tsv -
Export custom fields:
Terminal window curl -sf -H "$AUTH" "https://$VSA/api/v1.0/assetmgmt/assets/customfields" | jq . -
List your Agent Procedures for triage (you will re-author, not import):
Terminal window curl -sf -H "$AUTH" "https://$VSA/api/v1.0/automation/agentprocs?\$top=2000" \| jq -r '.Result[] | [.AgentProcedureId, .AgentProcedureName] | @tsv'
Phase 3 — Deploy the Breeze Agent with an Agent Procedure
Section titled “Phase 3 — Deploy the Breeze Agent with an Agent Procedure”-
Create the procedure. Agent Procedures → Manage Procedures → New Procedure. You need one step:
Execute Shell Command(orExecute PowerShell Command (64-bit)on modern VSA), run as System. -
Parameterise the enrollment key. Define a procedure variable for the per-machine-group key from Recipe 2. If you prefer one procedure for the whole estate, store the key in a custom field per machine group and read it with
#customfield#. -
Body: the Windows PowerShell payload from Recipe 3.
-
Add AV/EDR exclusions in both directions first — see Antivirus Exceptions.
-
Schedule it, don’t run it once. Schedule the procedure against one machine group with Distribution Window spread over a few hours and a daily recurrence for the length of your rollout window. Enable Skip if offline with retry so the schedule sweeps up laptops. The
agent.yamlcheck keeps re-runs harmless.
Agent Procedures: Plan to Re-author
Section titled “Agent Procedures: Plan to Re-author”Agent Procedures are step-based XML. There is no path from a procedure into a PowerShell script, and writing a converter is not worth it.
- Rank by use. VSA’s Agent Procedure Status and script logs show what has actually executed in the last year. Anything at zero does not migrate.
- Check the Breeze system library first —
GET /scripts/system-library. The standard maintenance procedures are already there. - Re-author the survivors as PowerShell or bash. Procedures built from
executeShellCommand/writeFilesteps translate almost directly; procedures built from VSA’sgetVariable/ifstep logic need rethinking rather than reproducing. - Bulk-load with Recipe 6,
availability: "partner".
Monitor Sets and Patching
Section titled “Monitor Sets and Patching”| Kaseya VSA | Breeze |
|---|---|
| Monitor Sets (counter/service/process) | Monitors + alert rules |
| Event Log Sets | Event log forwarding with alert rules |
| Alarms → tickets | Alert rules bound to a PSA integration |
| Patch Management policies | Patch policies |
| Patch approval by classification | Update rings |
| Machine group scheduling | Site timezone + maintenance windows |
Rebuild the top of your alarm-volume list partner-wide rather than porting monitor sets one for one.
Phase 6 — Decommission the Kaseya Agent
Section titled “Phase 6 — Decommission the Kaseya Agent”Only after Recipe 4 is clean for that organization.
-
Suspend alarms for the machine group (Agent → Suspend Alarms). Leave the agent installed.
-
Wait one full patch cycle.
-
Uninstall via VSA. The supported route is Agent → Uninstall Agent, which removes the agent and deletes the account. To do it from a procedure instead:
Terminal window $s = Get-Service -Name 'KaseyaAgent*' -ErrorAction SilentlyContinueforeach ($svc in $s) {$dir = (Get-CimInstance Win32_Service -Filter "Name='$($svc.Name)'").PathName -replace '^"?([^"]+)\\[^\\]+$','$1'if (Test-Path "$dir\KASetup.exe") { & "$dir\KASetup.exe" /r /s /g }}On macOS, run
/Library/Kaseya/*/Uninstaller.appor Kaseya’s supplied uninstall script. -
Verify from Breeze. Recipe 5 — Breeze Management Posture fingerprints Kaseya VSA. Drive the count to zero.
-
Delete the organization in VSA and reduce your agent count, after exporting anything you must retain.