ConnectWise sync: the complete field-mapping reference
If you run ConnectWise, you already know its entity model: Companies, Contacts, Agreements, Opportunities, Projects, Phases, Project Tickets, Members, and Time Entries. This page is the field-level reference for exactly how each maps into Current, which direction data flows, and who wins when both sides have touched the same record. Bookmark it — you'll come back to it.
For the plain-language version of how the connection is set up, see "Connect ConnectWise PSA and choose what syncs". For what triggers a write back — and the gates in front of every write — see "What Current writes back to ConnectWise (and when)".
How instance discovery works
ConnectWise instances don't share one API address — your company runs on a specific host and a versioned path that ConnectWise moves during upgrades. When you connect, Current calls ConnectWise's public site-discovery endpoint with your site URL and company ID, learns the right API host and version path, and stores them alongside the connection (they're not secrets). If ConnectWise relocates your instance later, Current notices the old path failing and re-resolves automatically — no manual URL maintenance, ever.
How the delta sync works
Every ConnectWise record carries a last-updated timestamp, and Current's 5-minute poll asks only for records updated since its last pass — per entity, each with its own cursor. Writes made by Current come back stamped with the API Member's identity, and Current skips those, so its own pushes are never re-imported as changes.
Companies
| ConnectWise field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Companies.id | ConnectWise company link (id) | pull only | ConnectWise |
| Companies.name | Company name | pull only | ConnectWise — 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.status | Active / inactive | pull only | ConnectWise |
| Companies.types | Company type | pull only | ConnectWise |
| Companies.phoneNumber / website | Phone / Website | pull only | ConnectWise |
| Companies.addressLine1 / addressLine2 / city / state / zip | Address fields | pull only | ConnectWise |
| Companies.market | Market / industry | pull only | ConnectWise when the field is set — never cleared to blank once Current has one |
| Companies.territoryManager (Territory Manager) | Account manager | pull + push | ConnectWise's Territory Manager is the account manager. If Current's account manager is empty, the Territory Manager fills it; if a manager reassigns the account in ConnectWise, 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 ConnectWise's Territory Manager (the person must be linked to a ConnectWise member). |
The Territory Manager becomes the account manager (chosen for ConnectWise on Jul 18, 2026). Auto-matching links by the member's email, so an account manager only fills once that person is linked to a Current user on Users & roles — if ConnectWise names a Territory 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 ConnectWise equivalent and are never pushed.
Contacts
ConnectWise stores a contact's email and phone numbers as a list of communication items rather than flat fields. Current flattens that list on the way in: the default email item becomes the contact's email, the default phone becomes phone, and a mobile item becomes mobile. On push, Current writes the same structure back, so ConnectWise stays canonical.
| ConnectWise field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Contacts.id | Contact link (id) | pull + push (new contacts) | — |
| Contacts.firstName / lastName | First name / Last name | pull only | ConnectWise |
| Contacts.title | Title | pull only | ConnectWise |
| communicationItems (default Email) | pull only | ConnectWise | |
| communicationItems (Phone / Mobile) | Phone / Mobile phone | pull only | ConnectWise |
| Contacts.defaultFlag | Primary contact flag | pull only | ConnectWise |
| Contacts.inactiveFlag | Active | pull only | ConnectWise |
Agreements and additions (your contracts)
Agreements are inbound only — Current reads them to power MRR, seat counts, customer status, and the whitespace grid, and never edits one. An agreement counts as active and recurring when its status resolves to active, it isn't cancelled, and its type and billing cycle read as recurring.
| ConnectWise field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Agreements.name / type | Contract name / type | pull only | ConnectWise |
| Agreements.startDate / endDate | Start / end date | pull only | ConnectWise |
| Agreements.agreementStatus / cancelledFlag | Contract status | pull only | ConnectWise |
| Agreements.billingCycle | Billing period + recurring flag | pull only | ConnectWise |
| Additions.product (catalog item) | Service line name | pull only | ConnectWise |
| Additions.quantity | Unit count (seats) | pull only | ConnectWise |
| Additions.unitPrice | Unit price | pull only | ConnectWise |
Opportunities (your deals)
Opportunities pull into the deals pipeline, and deal pushes go the other way once CRM write mode allows them. ConnectWise separates a deal's stage (where it sits in the pipeline) from its status (open, won, lost) — Current reads both: the stage maps through the stage mapping in your Manage drawer, and won/lost comes straight from the status record's own won and lost flags, so there's no label guessing.
- 1Open the stage mappingIntegrations → ConnectWise PSA → Manage → “Deal pipeline & stage mapping”. The badge there shows how many of your pipeline stages are still unmapped.
- 2Map each Current stage to a ConnectWise stageOpen the editor and pick the ConnectWise opportunity stage each of your Current pipeline columns corresponds to. Won and lost aren't mapped here — they come straight from the ConnectWise status's own won/lost flags.
- 3Why it mattersA deal only pushes its stage to ConnectWise once that stage is mapped — an unmapped stage fails closed and never writes, so a half-mapped pipeline silently won't push. Map every active column you want to sync.
| ConnectWise field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Opportunities.id | Deal link (id) | pull + push (new deals) | — |
| Opportunities.stage | Pipeline stage (via your stage mapping) | two-way | the side that moved it last |
| Opportunities.status (wonFlag / lostFlag) | Won / lost outcome | pull only | ConnectWise |
| Opportunities.expectedCloseDate | Expected close date | pull only | ConnectWise |
| Opportunities.primarySalesRep | Deal owner (via the member ↔ user link) | pull only | ConnectWise |
| Opportunities.company | Linked company | pull only | ConnectWise |
Projects, phases, and project tickets
A ConnectWise project imports as a ConnectWise-synced project — ConnectWise stays the source of truth for time and billing on it, and Current owns the schedule. ConnectWise's project tickets are the work items inside a project, so they become Current tasks.
| ConnectWise field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Projects.name | Project name | pull only | ConnectWise |
| Projects.status (project board status) | Project status | pull only | ConnectWise |
| Projects.company | Linked company | pull only | ConnectWise |
| Projects.manager | Project manager (via the member link) | pull only | ConnectWise |
| Projects.estimatedStart / estimatedEnd | Project dates | pull only | ConnectWise |
| Projects.estimatedHours | Budget hours | pull only | ConnectWise |
| Phases.description | Phase name | pull only | ConnectWise |
| Phases.scheduledStart / scheduledEnd | Phase dates | pull only | ConnectWise |
| Project tickets.summary | Task name | pull only | ConnectWise |
| Project tickets.status (board status) | Task status (backlog/in progress/review/done) | two-way (see below) | depends on your two-way sync setting |
| Project ticket dates | Task start / end dates | two-way | Current — after the first import, Current's scheduler owns task dates and pushes changes out |
| Project tickets.budgetHours | Estimated hours | pull only | ConnectWise |
| Project tickets.wbsCode | Work-breakdown position | pull only | ConnectWise |
Service tickets
Service tickets with no project attached feed the read-only company ticket history behind account insight, sentiment, and SBR statistics — grouped by service board, which is where the board-noise toggles apply. They never become project tasks, and Current never edits them.
Members (your staff)
| ConnectWise field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| Members.identifier | Member link | pull only | ConnectWise |
| Members.firstName + lastName | Name | pull only | ConnectWise |
| Members.email | Email — the link key to a Current login | pull only | ConnectWise |
| Members.inactiveFlag | Active | pull only | ConnectWise |
Time entries
A ConnectWise time entry charges to something — for project work, that's the project ticket. Current logs time against the task and submits it as a time entry charged to that ticket, with the work role, work type, and agreement you picked. The vocabulary differs from Autotask — work role where you'd say billing code, agreement where you'd say contract — and Current's time dialog labels follow the PSA you run.
| ConnectWise field | Becomes in Current | Direction | Who wins |
|---|---|---|---|
| TimeEntries.id | Time entry link (id) | two-way | — |
| TimeEntries.member | Logged-by user | two-way | — |
| chargeToId / chargeToType | Linked task (project ticket) | two-way | — |
| timeStart / timeEnd / actualHours | Date, times, and hours | two-way | ConnectWise |
| workRole / workType / agreement | Work role / Work type / Agreement | push, then mirrored back | ConnectWise |
| billableOption | Billable flag | two-way | ConnectWise |
| Time status + invoice linkage | Approval / invoiced status | pull-back after push (read-back) | ConnectWise — an invoiced entry can never be edited from Current |
Board statuses: how done means done
ConnectWise statuses live per board, and each status carries its own closed flag. Current builds its status map from your boards' live lists: a status ConnectWise flags as closed maps to done, and the rest map to Current's simplified stages by their labels. The original ConnectWise status id is always kept alongside the simplified stage, so nothing is lost in translation — and the board/status mapping in the Manage drawer lets you correct any board whose labels don't say what they mean.
Holidays and time off (PTO)
Current keeps your scheduler honest by reading two things from ConnectWise's schedule area: company holidays and member time off.
- +Holidays come from your ConnectWise holiday lists. Every date across every list 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 ConnectWise-synced one you delete there reappears on the next sync (remove it in ConnectWise to make it stick).
- +Time off comes from ConnectWise schedule entries whose type reads like PTO (vacation, sick, out of office, and the like). Each becomes per-day PTO for that member in Current, so the Timeline, dependency map, and what-if scenarios all schedule around real absence. Only members linked to a Current user produce PTO rows.
Both pulls are read-only and self-healing: a cancelled holiday or a shortened time-off request disappears on the next sync. If your API member can't read the schedule area, Current simply skips these pulls with a note rather than failing your whole sync — add holidays and PTO by hand in the meantime.
What's deliberately not synced
- +ConnectWise appointments and other non-time-off schedule entries don't pull — only company holidays and PTO-type time off feed the scheduler.
- +Ticket attachments aren't downloaded — attachment handling for ConnectWise is a planned follow-on.
- +Project health scores, total MRR, and MRR at risk are computed in Current and never pushed to any ConnectWise field.
- +Agreements, additions, and the product catalog are read-only in every direction — Current never edits your billing structures.
- +Current polls; it does not register ConnectWise callbacks. The 5-minute delta covers change detection without a webhook's failure modes.
