HaloPSA sync: the complete field-mapping reference
This page is the field-level reference for exactly how each Halo record maps into Current, which direction data flows, and who wins when both sides have touched the same record. Halo's vocabulary has a few surprises worth knowing up front, so this article names them as it goes. Bookmark it — you'll come back to it.
For the plain-language version of how the connection is set up, see "Connect HaloPSA and choose what syncs". For what triggers a write back — and the gates in front of every write — see "What Current writes back to HaloPSA (and when)".
Clients (your customer companies)
A Halo Client becomes a company in Current's CRM. Halo keeps a client's phone and address on its main site rather than on the company record itself, so Current reads those through the main site.
| HaloPSA field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Client id | Halo company link (id) | pull only | HaloPSA |
| Client name | Company name | pull only | HaloPSA — unless you've renamed the company in Current and that rename hasn't synced back yet, in which case your edit is protected until it does |
| Client inactive flag | Active / inactive | pull only | HaloPSA |
| Main site phone + delivery address | Phone / Address | pull only | HaloPSA |
| Client website | Website | pull only | HaloPSA |
| accountmanagertech (Account Manager) | Account manager | pull + push | Halo's account-manager agent becomes the account manager. If Current's account manager is empty, Halo fills it; if a manager reassigns the account in Halo, that wins. An in-app AE claim or leadership reassignment made in Current is never overwritten, and when you push a company its account manager is written back as Halo's account-manager agent (the person must be linked to a Halo agent). |
| Client classifications (categories) | Company classification | pull only | HaloPSA |
Halo's account manager is a native, first-class field on the client — the agent responsible for it. Auto-matching links Halo agents to Current users by email, so an account manager only fills once that person is linked to a Current user on Users & roles; if Halo names an account manager who isn't linked, the account simply shows no manager (and a company push fails loudly rather than guessing).
Current-only fields on the company record — total MRR, MRR at risk, lead source — have no Halo equivalent and are never pushed.
Contacts and staff
Halo Users are your client-side contacts; they become CRM contacts in Current. Halo Agents are your internal staff; they mirror to your team roster and are the link between a Halo person and a Current sign-in.
| HaloPSA field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| User (contact) id | Contact link (id) | pull + push (new contacts) | — |
| User firstname / surname | First name / Last name | pull only | HaloPSA |
| User emailaddress | pull only | HaloPSA | |
| User phonenumber / mobilenumber | Phone / Mobile phone | pull only | HaloPSA |
| User inactive flag | Active | pull only | HaloPSA |
| Agent email + name | Team member (the link key to a Current login) | pull only | HaloPSA |
| Agent isdisabled flag | Active staff | pull only | HaloPSA |
Opportunities (your deals)
In Halo an opportunity is a ticket flagged as a sales opportunity, and it carries its money split into one-off, monthly, and annual figures. Opportunities pull into the deals pipeline, and deal pushes go the other way once CRM write mode allows them.
| HaloPSA field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Opportunity id | Deal link (id) | pull + push (new deals) | — |
| oppvalue_oneoff / _monthly / _annual | Deal value (one-off + recurring) | pull only | HaloPSA |
| pipeline_stage_id | Pipeline stage (via your stage mapping) | two-way | the side that moved it last |
| Won status + oppconverteddate | Won outcome + won date | pull only | HaloPSA — a deal is won when it reaches your won status; there's no simple won flag, so Current reads Halo's own status and workflow, not a label |
| targetdate | Expected close date | pull only | HaloPSA |
| agent_id | Deal owner (via the agent ↔ user link) | pull only | HaloPSA |
| client_id | Linked company | pull only | HaloPSA |
Projects, milestones, and tasks
A Halo project is a ticket with project features turned on, so it imports as a Halo-synced project — Halo stays the source of truth for time and billing on it, and Current owns the schedule. Its milestones become phase containers, and the work inside it becomes Current tasks. Halo builds that work two ways — as child tickets or as to-do checklist items — and Current handles both.
| HaloPSA field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Project summary | Project name | pull only | HaloPSA |
| Project status | Project status (via your status mapping) | pull only | HaloPSA |
| Project client | Linked company | pull only | HaloPSA |
| Project agent | Project manager (via the agent link) | pull only | HaloPSA |
| startdate / targetdate / deadlinedate | Project dates | pull only | HaloPSA |
| estimate / budgethours | Budget hours | pull only | HaloPSA |
| projectcompletionpercentage | % complete (display) | pull only | HaloPSA — computed by Halo, never pushed back |
| Milestones | Phases (containers) | pull only | HaloPSA |
| Milestone name / sequence / dates | Phase name / order / dates | pull only | HaloPSA |
| Child ticket summary | Task name | pull only | HaloPSA |
| Child ticket status | Task status (backlog/in progress/review/done) | two-way (see below) | depends on your two-way sync setting |
| Child ticket dates | Task start / end dates | two-way | Current — after the first import, Current's scheduler owns task dates and pushes changes out |
| Child ticket estimate | Estimated hours | pull only | HaloPSA |
| To-do item (text / done / sequence) | Checklist item on the task | pull only | HaloPSA |
Halo's task-to-task date dependencies pull in as Current dependency edges. Halo only carries a single finish-to-start style dependency with no lead or lag, so Current stores its richer dependency detail on its own side and pushes back a plain finish-to-start edge Halo can honour.
Time entries
Halo has no separate "time entry" object — time is logged as an action on a ticket, and an action with hours on it is the time entry. Current logs time against the task and submits it as an action against the Halo ticket, with the charge rate and contract you picked. The vocabulary differs from Autotask — charge rate where you'd say billing code, contract where you'd say agreement — and Current's time dialog labels follow the PSA you run.
| HaloPSA field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Action id | Time entry link (id) | two-way | — |
| Action agent | Logged-by user | two-way | — |
| Action ticket | Linked task (project ticket) | two-way | — |
| timetaken (hours logged) | Hours | two-way | HaloPSA |
| timetakenadjusted (hours billed) | Billed hours (mirrored separately) | pull-back after push | HaloPSA — the rate engine's minimum/increment/rounding and multipliers mean billed hours can differ from logged hours; that's Halo working, not an error |
| actisbillable + charge rate + contract | Billable flag / rate / contract | push, then mirrored back | HaloPSA |
| Invoice linkage (action on an invoice) | Invoiced status | pull-back after push (read-back) | HaloPSA — an invoiced action can never be edited from Current |
Holidays and time off (PTO)
Current keeps your scheduler honest by reading two different things from Halo's calendar.
- +Holidays come from Halo's Workday configuration, which carries a list of company holiday dates. Every date pulls in as a read-only company holiday, and the dependency and cascade scheduler skips those days — just like weekends — so task dates never land on a day no one is working. You can still add holidays by hand on the Holidays admin page; a Halo-synced one you delete there reappears on the next sync (remove it in Halo to make it stick).
- +Time off comes from Halo's calendar appointments that are typed as holiday/leave. Each becomes per-day PTO for that agent in Current, so the Timeline, dependency map, and what-if scenarios all schedule around real absence. A multi-day leave request is spread across each day it covers, and only agents linked to a Current user produce PTO rows.
Both pulls are read-only and self-healing: a cancelled holiday or a shortened leave request disappears on the next sync. If your API application can't read the calendar, Current simply skips these pulls with a note rather than failing your whole sync — add holidays and PTO by hand in the meantime.
Contracts and MRR
Halo client contracts are inbound only — Current reads them to power MRR, customer status, and the whitespace grid, and never edits one. A contract's billing period (monthly, quarterly, six-month, annual) is normalized to a true monthly figure so amounts read consistently.
| HaloPSA field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| ClientContract name / dates | Contract name / start / end | pull only | HaloPSA |
| Contract active + started + not-expired | Contract status | pull only | HaloPSA |
| Billing period + recurring charge | Billing period + monthly MRR | pull only | HaloPSA |
| Recurring contract lines (item, quantity, price) | Service lines feeding MRR | pull only | HaloPSA |
What's deliberately not synced
- +Invoices are read-only in every direction — Current surfaces whether time has been invoiced but never creates, posts, or voids a Halo invoice.
- +Contracts and the product catalog are read-only — Current never edits your billing structures.
- +Project health scores, total MRR, and MRR at risk are computed in Current and never pushed to any Halo field.
- +Halo project completion percentage and other rollups are Halo's own math — read for display, never written back.
- +Current polls Halo for changes; it does not rely on Halo's webhooks, which carry no signature Current could verify.
