Skip to content
Current/ Help Center

HaloPSA sync: the complete field-mapping reference

11 min read · Updated Jul 18, 2026

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)".

Note
Two Halo naming gotchas
In Halo, "Users" means your CONTACTS (the client-side people), and "Agents" means your STAFF (the technicians). Current maps them the right way round — Halo Users become CRM contacts, Halo Agents become your team. Separately, a Halo "Client" is a customer company, and a Halo "Project" is really a ticket with project features turned on. Everything below already accounts for that.
Note
New as of July 2026 — a few Halo specifics are still being confirmed
Where a mapping depends on a Halo behaviour that's still being confirmed against live instances — the won-status read, the prepay deduction timing, the billing-period codes, and the exact project deep-link path — it's flagged inline. In every one of those cases Current is built to fail safe: it reads the human-readable value, leaves an unfamiliar one alone, and never guesses.

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 fieldBecomes in CurrentDirectionWho wins
Client idHalo company link (id)pull onlyHaloPSA
Client nameCompany namepull onlyHaloPSA — 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 flagActive / inactivepull onlyHaloPSA
Main site phone + delivery addressPhone / Addresspull onlyHaloPSA
Client websiteWebsitepull onlyHaloPSA
accountmanagertech (Account Manager)Account managerpull + pushHalo'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 classificationpull onlyHaloPSA

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 fieldBecomes in CurrentDirectionWho wins
User (contact) idContact link (id)pull + push (new contacts)
User firstname / surnameFirst name / Last namepull onlyHaloPSA
User emailaddressEmailpull onlyHaloPSA
User phonenumber / mobilenumberPhone / Mobile phonepull onlyHaloPSA
User inactive flagActivepull onlyHaloPSA
Agent email + nameTeam member (the link key to a Current login)pull onlyHaloPSA
Agent isdisabled flagActive staffpull onlyHaloPSA

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 fieldBecomes in CurrentDirectionWho wins
Opportunity idDeal link (id)pull + push (new deals)
oppvalue_oneoff / _monthly / _annualDeal value (one-off + recurring)pull onlyHaloPSA
pipeline_stage_idPipeline stage (via your stage mapping)two-waythe side that moved it last
Won status + oppconverteddateWon outcome + won datepull onlyHaloPSA — 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
targetdateExpected close datepull onlyHaloPSA
agent_idDeal owner (via the agent ↔ user link)pull onlyHaloPSA
client_idLinked companypull onlyHaloPSA
Note
How "won" is decided — still being confirmed
Halo has no fixed "Won" value; a deal is won when it reaches a status you configure as won, resolved at sync time against Halo's own status list rather than by matching a label. The exact API read for that is one of the behaviours still being confirmed on live instances — the reliable setup is a clearly-defined won stage on your sales workflow.

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 fieldBecomes in CurrentDirectionWho wins
Project summaryProject namepull onlyHaloPSA
Project statusProject status (via your status mapping)pull onlyHaloPSA
Project clientLinked companypull onlyHaloPSA
Project agentProject manager (via the agent link)pull onlyHaloPSA
startdate / targetdate / deadlinedateProject datespull onlyHaloPSA
estimate / budgethoursBudget hourspull onlyHaloPSA
projectcompletionpercentage% complete (display)pull onlyHaloPSA — computed by Halo, never pushed back
MilestonesPhases (containers)pull onlyHaloPSA
Milestone name / sequence / datesPhase name / order / datespull onlyHaloPSA
Child ticket summaryTask namepull onlyHaloPSA
Child ticket statusTask status (backlog/in progress/review/done)two-way (see below)depends on your two-way sync setting
Child ticket datesTask start / end datestwo-wayCurrent — after the first import, Current's scheduler owns task dates and pushes changes out
Child ticket estimateEstimated hourspull onlyHaloPSA
To-do item (text / done / sequence)Checklist item on the taskpull onlyHaloPSA

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 fieldBecomes in CurrentDirectionWho wins
Action idTime entry link (id)two-way
Action agentLogged-by usertwo-way
Action ticketLinked task (project ticket)two-way
timetaken (hours logged)Hourstwo-wayHaloPSA
timetakenadjusted (hours billed)Billed hours (mirrored separately)pull-back after pushHaloPSA — 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 + contractBillable flag / rate / contractpush, then mirrored backHaloPSA
Invoice linkage (action on an invoice)Invoiced statuspull-back after push (read-back)HaloPSA — an invoiced action can never be edited from Current
Heads up
Invoiced time is immutable, and prepay draws down on the action
Once a Halo action is on an invoice, Current treats it as final and never edits or deletes it. And because logging billable time against a prepaid (Pre-Pay) contract draws down the client's prepaid balance in Halo, Current never re-sends a time entry blindly — every push is claimed once and confirmed by Halo's response, so a retry can't double-charge or over-draw prepaid hours. (The exact moment prepay is deducted is one of the Halo behaviours still being confirmed on live instances; Current's no-double-send rule protects the balance either way.)

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 fieldBecomes in CurrentDirectionWho wins
ClientContract name / datesContract name / start / endpull onlyHaloPSA
Contract active + started + not-expiredContract statuspull onlyHaloPSA
Billing period + recurring chargeBilling period + monthly MRRpull onlyHaloPSA
Recurring contract lines (item, quantity, price)Service lines feeding MRRpull onlyHaloPSA
Note
Billing period — read from the label, never guessed
Halo stores a contract's billing period as a numeric code whose exact meaning varies by version, so Current reads the human-readable period label to decide the cadence. An unfamiliar period is left blank (which safely defaults to monthly) rather than divided by the wrong number — MRR is never silently written wrong.

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.
Tip
Related reading
For push behavior specifically — what triggers a write to Halo, the gates, and what a push can never touch — see "What Current writes back to HaloPSA (and when)".
Was this helpful?