Autotask sync: the complete field-mapping reference
If you run Autotask, you already know its entity model: Companies, Contacts, Projects, Phases, Tasks, Tickets, Resources, TimeEntries, Contracts, and more. This page is the field-level reference for exactly how each Autotask entity maps into Current, which direction data flows, and who wins when both sides have touched the same field. Bookmark it — you'll come back to it.
For the plain-language version of how the connection is set up, see "Connect Autotask and choose what syncs". For the philosophy behind who owns what, see "Our methodology: your PSA stays the source of truth". For the schedule these pulls run on, see "How often does Current sync? Every schedule, in one table".
How zone discovery works
Autotask's REST API doesn't have one fixed address — each Autotask database lives on a numbered "zone," and your API credentials only work once Current knows which zone to call. When you first connect Autotask, Current calls Autotask's public zone-lookup endpoint with your API username. Autotask returns the correct API base URL and zone name for your account, and Current stores that base URL (not a secret) alongside your connection. Every sync call after that goes straight to your zone — there's no repeated lookup per request.
Companies
Companies are pulled from Autotask into the company record — this direction never reverses. Current never creates or edits a Companies record back in Autotask for existing synced accounts.
| Autotask field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Companies.id | Autotask company link (id) | pull only | Autotask |
| Companies.companyName | Company name | pull only | Autotask — 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 |
| Companies.ownerResourceID | Account manager | pull only | fills only when empty — never overwrites an account manager you've set in Current |
| Companies.phone | Phone | pull only | Autotask |
| Companies.webAddress | Website | pull only | Autotask |
| Companies.address1 / address2 | Address lines 1 & 2 | pull only | Autotask |
| Companies.city / state / postalCode | City / State / Postal code | pull only | Autotask |
| Companies.companyType (picklist) | Company type | pull only | Autotask |
| Companies.classification (picklist) | Classification | pull only | Autotask |
| Companies.marketSegmentID (picklist) | Market segment and industry | pull only | Autotask when the field is set — a segment is never cleared to blank once Current has one |
| Companies UDF: HubSpot Company Record ID | HubSpot link (if you also use HubSpot import) | pull only | Autotask |
Current-only fields that live on the company record — like total MRR, MRR at risk, and lead source — have no Autotask equivalent and are never pushed. See "Mapping CRM industries to Autotask Market Segments" for how the market segment picklist specifically becomes the industry shown on the company record.
Contacts
| Autotask field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Contacts.id | Contact link (id) | pull + push (new contacts) | — |
| Contacts.firstName / lastName | First name / Last name / full name | pull only | Autotask |
| Contacts.title | Title | pull only | Autotask |
| Contacts.emailAddress | pull only | Autotask | |
| Contacts.phone | Phone | pull only | Autotask |
| Contacts.mobilePhone | Mobile phone | pull only | Autotask |
| Contacts.primaryContact | Primary contact flag | pull only | Autotask (defaults to no if a zone doesn't expose this field) |
| Contacts.isActive | Active | pull only | Autotask |
A contact you create in the CRM (in Current) is pushed to Autotask as a new Contacts record under that company. Once a contact exists in both systems, ongoing field refreshes (name, title, email, phone) still pull from Autotask — Autotask is the system of record for who a contact is.
Projects
| Autotask field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Projects.id | Project link (id) | two-way | — |
| Projects.projectNumber | Project number | pull only | Autotask |
| Projects.projectName | Project name | two-way | Autotask |
| Projects.companyID | Linked company | pull only | Autotask |
| Projects.contractID | Linked contract name | pull only | Autotask |
| Projects.status (picklist) | Project status (active/completed) | pull only | Autotask, backed up by a completed date or 100% completion if the status label is ambiguous |
| Projects.completedPercentage | Progress | pull only | Autotask |
| Projects.endDateTime | Due date | pull only | Autotask |
| Projects.projectCostsRevenue / projectCostsBudget | Budget used % | pull only | Autotask |
| Projects.estimatedTime | Budget hours | pull only | Autotask |
| Projects.laborEstimatedRevenue | Budget amount | pull only | Autotask |
| Projects.projectType (picklist) | Project type / template flag | pull only | Autotask |
| — (no Autotask field) | Project health indicator | Current-only | Current |
Building a Current-native project in Autotask (from a playbook, template, or won quote) creates a new Autotask project by pushing project name, linked company, start/end dates, and the required type/status picklists. See "Building projects in your PSA from a template or won quote" and "Project modes: PSA-synced or Current-native" for when this conversion happens and why it's permanent.
Phases
| Autotask field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Phases.id | Phase link (id) | pull only | Autotask |
| Phases.projectID | Parent project | pull only | Autotask |
| Phases.title | Phase name | two-way (with two-way sync on) | a phase you add on the project Overview is created in Autotask, and a rename is pushed and read back to confirm it stored. Autotask's title wins on a pull |
Phase order is Current's own — Autotask has no phase sort field, so reordering never pushes and your order survives every pull. A phase Current couldn't create in Autotask carries a "Not in Autotask" chip you can click to send it again. See "Organize work with phases and tasks" for how phases work day to day.
Tasks
Tasks carry the most fields of any synced entity, because task scheduling is where Current adds the most value over Autotask's own project module.
| Autotask field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Tasks.id / taskNumber | Task link / task number | pull only | Autotask |
| Tasks.status (picklist) | Task status (backlog/in progress/review/done) | two-way (see below) | depends on your two-way sync setting |
| Tasks.phaseID | Parent phase | two-way (with two-way sync on) | last editor wins — drag a task to another phase on the Overview and the new phase is pushed. A move into General, or into a phase not yet in Autotask, stays in Current and says so |
| Tasks.title | Task name | two-way (with two-way sync on) | last editor wins, by the task's last activity in Autotask against the moment you renamed it |
| Tasks.startDateTime / endDateTime | Start date / End date | two-way (with two-way sync on) | last editor wins, per date — a reschedule in Autotask flows back into Current; a Current reschedule pushes out to Autotask. Start and end are tracked independently. A date set in Autotask where Current had none comes through, and a date you clear in Current stays cleared. With two-way sync off, Current owns dates and only pushes them out. |
| Tasks.description | Description | two-way (with your two-way sync setting on) | last editor wins, by timestamp |
| Tasks UDF: Partner Facing | Partner-visible flag | pull only | Autotask |
| Tasks UDF: Issue / Issue Reported By | Issue text / reported by | pull only | Autotask |
| Tasks UDF: Change Order Hours | Change order hours | pull only | Autotask |
| Tasks.purchaseOrderNumber | PO number | pull only | Autotask |
| Tasks.isVisibleInClientPortal | Visible to partner | pull only | Autotask |
| Tasks.canClientPortalUserCompleteTask | Partner can complete | pull only | Autotask |
| Tasks.priority | Priority order | two-way (with the setting on) | last editor wins |
| Tasks.estimatedHours | Estimated hours | two-way (with the setting on) | last editor wins |
| Tasks.hoursToBeScheduled | Hours to schedule | pull only | Autotask |
| Tasks.remainingHours | Remaining hours | pull only | Autotask |
| Tasks.isTaskBillable | Billable flag | pull only | Autotask |
| Tasks.assignedResourceID / assignedResourceRoleID | Assignee / assignee role | two-way | see Secondary Resources below |
| Tasks.taskType (picklist) | Task type | two-way (with the setting on) | last editor wins |
| Tasks.departmentID (picklist) | Department | two-way (with the setting on) | last editor wins |
| TaskSecondaryResources (child) | Secondary assignees | two-way | see below |
| TaskAttachments (child, count only) | Attachment count | pull only | Autotask |
| ServiceCallTasks (child, count only) | Scheduled service call count | pull only | Autotask |
Task dates are Current's biggest ownership claim: after the very first pull, Current's dependency-aware scheduler owns start and end dates, and pushes them to Autotask — not the reverse. See "What is a critical path (and how Current finds it)" and "The Timeline view: drag to reschedule, and back-scheduling" for how those dates get set.
The two-way sync setting, and how task conflicts are resolved
By default, two-way sync is off, and task fields refresh from Autotask on every pull. Turn it on in Settings → Integrations → Autotask, and six specific task fields become genuinely bidirectional: status, description, task type, department, estimated hours, and priority.
With two-way sync on, Current compares each field individually: if the incoming Autotask value is different from what Current last saw, and Autotask's own last-activity timestamp is newer than your last edit to that field in Current, Autotask's value wins. If your Current edit is more recent, it's kept — and the Autotask value is not marked as "seen," so a real change on the Autotask side that got deferred will still surface and be applied later rather than silently disappearing.
Secondary resources
Autotask's TaskSecondaryResources are pulled into the task's list of assignees beyond the primary. When you change assignees in Current — adding or removing someone from a task — Current reconciles the whole list back to Autotask: newly added people are created as secondary resources, and removed people are deleted from Autotask's side. Current automatically picks a role each resource is actually eligible for in Autotask, so you don't get a role-mismatch rejection.
Tickets
| Autotask field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Tickets.id / ticketNumber | Ticket link / ticket number | pull only | Autotask |
| Tickets.title | Ticket name | pull only | Autotask |
| Tickets.description | Description | pull only | Autotask |
| Tickets.status (picklist) | Status (open/assigned/pending/resolved/closed) | two-way for status only | see "push status" below |
| Tickets.assignedResourceID | Assignee | pull only | Autotask |
| Tickets.dueDateTime | Due date | pulled once, then Current-owned | Current after import |
| Tickets.completedDateTime | Resolved date | pull only | Autotask |
| Tickets.createDate | Created date | pull only | Autotask |
| Tickets.resolution | Resolution notes | pull only | Autotask |
| Tickets.estimatedHours | Estimated hours | pull only | Autotask |
| Tickets.priority (picklist) | Priority | pull only | Autotask |
You can change a ticket's status from Current, which pushes back to Autotask. See "Logging time on a ticket vs. a task" for how ticket time entries work.
Resources (your staff)
| Autotask field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Resources.id | Resource link (id) | pull only | Autotask |
| Resources.firstName + lastName | Name | pull only | Autotask |
| Resources.title | Role | pull only | Autotask |
| Resources.isActive | Active | pull only | Autotask |
| Resources.email / userName | pull only | Autotask | |
| Resources.internalCost | Internal cost rate | pull only | Autotask (a 0 or missing value is treated as "not provided" and never overwrites a rate you've entered by hand) |
Resources are matched to Current user accounts by email, which is what drives account-manager and deal-owner auto-matching in the CRM. Internal cost rates feed "Holidays and employee costs: where the numbers come from."
Time entries
| Autotask field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| TimeEntries.id | Time entry link (id) | two-way | — |
| TimeEntries.resourceID | Logged-by user | two-way | — |
| TimeEntries.taskID / ticketID | Linked task or ticket | two-way | — |
| TimeEntries.dateWorked | Date worked | two-way | Autotask |
| TimeEntries.hoursWorked | Hours | two-way | Autotask |
| TimeEntries.startDateTime / endDateTime | Start/end time | two-way | — |
| TimeEntries.summaryNotes | Summary | two-way | Autotask |
| TimeEntries.billingApprovalDateTime | Approval status | pull-back after push (read-back) | Autotask — Current only ever promotes to approved, never demotes |
See "Logging time and how it reaches your PSA's billing" for the full time-entry-to-billing flow, and the companion article "What Current writes back to Autotask (and when)" for exactly what's included on the outbound time entry push.
Contracts and services
Contracts and their services are inbound only — Current reads your Autotask contracts to power revenue and coverage reporting, and never edits a contract.
| Autotask field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Contracts.id | Contract link (id) | pull only | Autotask |
| Contracts.companyID | Linked company | pull only | Autotask |
| Contracts.contractName | Contract name | pull only | Autotask |
| Contracts.startDate / endDate | Start / end date | pull only | Autotask |
| Contracts.contractType (picklist) | Contract type + recurring flag | pull only | Autotask |
| Contracts.contractCategory (picklist) | Category | pull only | Autotask |
| Contracts.status (picklist) | Status | pull only | Autotask |
| Contracts.contractPeriodType (picklist) | Billing period (monthly/quarterly/semi-annual/annual/one-time) | pull only | Autotask |
| ContractServiceUnits.units | Unit count (for active recurring contracts) | pull only | Autotask |
| ContractServices.unitPrice | Unit price | pull only | Autotask |
| ContractServices.isActive | Service active flag | pull only | Autotask |
| Services.name (via serviceID) | Service name | pull only | Autotask |
Four more things travel with a contract service line, all read-only like the rest. The line's vendor unit cost (ContractServices.unitCost) comes across so margin reporting has a cost side; a cost of zero is stored as zero once the sync has seen a real cost somewhere on your contracts, and where your API user cannot read costs at all Current records that instead of reporting your contracts as free. Each line also carries the period its price is quoted in, read from the service itself (Services.periodType) rather than the contract's billing period, and that is what converts the line to a monthly figure — so an annual service on a monthly contract counts as a twelfth per month, and a monthly service on an annually billed contract counts at full price. Service bundles come in too (ContractServiceBundles with their own units and the ServiceBundles catalog behind them), each as a single line named after the bundle, which is why a hosted-VoIP contract that used to look empty now shows its seats. And because Autotask gives no reliable way to tell a deleted contract service from an inactive one, Current retires a line when a complete re-read of that contract no longer returns it: the line stops counting toward MRR and vendor cost from that pass onward, and it comes back on its own if the line reappears. Seat history is deliberately left alone, so a retired line's units still show in the headcount trend.
Billed items
Contract lines say what an account is priced at. Billed items say what it was charged. Current mirrors Autotask's BillingItems entity, inbound only, so account profitability can separate the three kinds of revenue an MSP earns from the same account:
- +Recurring services: recurring service and subscription items.
- +Projects: milestones, project costs, and labor posted against a project.
- +One-time and T&M: ticket labor, ticket costs, and expenses.
- +Anything else: an item type that fits none of the three is counted on its own, so it never inflates a figure a renewal decision rests on.
Before this mirror existed, billable ticket hours were charged against recurring revenue that never included the money they earned.
| Autotask field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| BillingItems.id | Billed item link (id) | pull only | Autotask |
| BillingItems.companyID | Linked company — an item for a company Current hasn't mirrored is kept unlinked rather than dropped | pull only | Autotask |
| BillingItems.billingItemType | Item kind: labor, project cost, ticket cost, expense, subscription, recurring service, milestone | pull only | Autotask |
| BillingItems.subType | Item sub-type | pull only | Autotask |
| BillingItems.itemDate | Item date — the date the revenue split reports on | pull only | Autotask |
| BillingItems.postedDate | Posted (approved) date | pull only | Autotask |
| BillingItems.invoiceID | Invoice link. An item that has one counts as invoiced, which is what profitability’s “X% of it has reached an invoice” line is built from | pull only | Autotask |
| BillingItems.quantity / rate | Quantity and rate | pull only | Autotask |
| BillingItems.totalAmount / extendedPrice | Amount (what the split counts as revenue) | pull only | Autotask |
| BillingItems.nonBillable | Non-billable flag — the item is mirrored and counts as zero revenue | pull only | Autotask |
| BillingItems.contractID / contractServiceID / contractServiceBundleID | Contract, contract line, and bundle links | pull only | Autotask |
| BillingItems.ticketID / projectID / taskID / timeEntryID | Ticket, project, task, and time-entry links (what decides project vs one-time) | pull only | Autotask |
| BillingItems.billingCodeID / roleID | Billing code and role | pull only | Autotask |
| BillingItems.itemName | Item name | pull only | Autotask |
The first walk reaches 400 days back, in date-windowed chunks that resume where the last one stopped, so a book with years of billing history doesn't have to finish in one sync. It runs alongside the other six-hourly lookups. Whether a figure is complete is decided by the data rather than by the walk: while the oldest mirrored item is newer than the start of the window you are looking at, because the walk hasn't reached that far back yet or because Autotask holds nothing older, profitability shows project and one-time revenue as a floor rather than a total. Once the first walk finishes, a rolling 45-day window re-reads recent items so an item that was posted, invoiced, corrected, or removed in Autotask catches up. An item that disappears from a window Current re-reads in full is marked as removed and stops counting.
Billed items are an Autotask feature in this release. ConnectWise and HaloPSA workspaces see the recurring side of profitability as before, with project and one-time revenue shown as not mirrored yet.
Holidays
Autotask holidays (from your configured holiday sets) pull in as read-only calendar entries — date and name — used by the scheduler to avoid booking work on days off. See "PTO and availability-aware scheduling in the Timeline". If your Autotask zone doesn't expose the Holidays entity, this pull is skipped quietly rather than failing your whole sync.
Notes
Company notes are the one entity where Autotask and Current genuinely share write access, with a simple rule: whichever side authored a note owns it. Notes pulled in from Autotask get refreshed on re-sync; notes you write in Current and push to Autotask are left alone by later Autotask pulls. Notes you push from Current are always created as internal — a pushed note never becomes visible on the Autotask client portal.
Picklists and status mapping
Autotask's various status and type fields are picklists — numeric ids with zone-specific labels. Current resolves these live from Autotask's field metadata (not a hardcoded list), so a picklist you've customized in Autotask is read correctly. Task and ticket status specifically collapse Autotask's many possible labels into Current's own simplified stages (backlog/in progress/review/done for tasks; open/assigned/pending/resolved/closed for tickets) by matching keywords in the label — a status labeled anything containing "complete" becomes done, anything with "progress" becomes in progress, and so on. The original Autotask status id is always kept alongside the simplified stage, so nothing is lost in translation.
What's deliberately not synced
- +Company, contract, contract-service, company-ticket, and company-note pulls are all read-only by design — Current never patches these Autotask records except through the specific CRM push flows described in "What Current writes back to Autotask (and when)".
- +Project health scores are Current-only — there's no Autotask equivalent field.
- +The cost figure Autotask carries on a billed item is never read. Cost in Current comes from technician cost rates and the vendor unit cost on contract lines, and both stay behind the workspace-admin cost wall.
- +Total MRR, MRR at risk, and renewed MRR shown in the CRM are computed in Current and never pushed to any Autotask field.
- +Task worked-hours are computed from real logged time entries, never from Autotask's estimated/remaining hours math.
- +Calendar appointments only sync as a generic "busy" marker — the real appointment subject line is never pulled, so a private subject never leaks tenant-wide.
- +Once imported, ticket due dates and assignment become Current-owned and are not overwritten by later Autotask pulls.
