clj.orcery

Language, Expression and Design

Friday

03

April 2015

Syncing Jira Worklogs to ConnectWise Time Entries: Keeping MSP Billing Accurate When Work Happens in Jira

Last updated: November 2026

To keep MSP billing accurate when engineers work in Jira, sync each Jira worklog to a ConnectWise PSA time entry on the linked service ticket, translating the worklog's duration, start time and author into a ConnectWise member, work type, work role and billable flag, and making sure the entry lands under the correct company and agreement. Map ConnectWise companies to Jira projects or organizations and board statuses to Jira statuses so every hour logged in Jira has a valid home in ConnectWise. Done this way, a ConnectWise Jira integration removes double entry without creating billing errors. ZigiOps, the no-code integration platform by ZigiWave, is one way to configure this mapping in a UI instead of writing and maintaining custom code.

Managed service providers increasingly work inside their clients' tools. A client's development team runs Jira, so the MSP's engineers pick up issues, comment and log time there. Meanwhile, the MSP's business runs on ConnectWise PSA (also known as ConnectWise Manage): service tickets, agreements, time entries and invoices all live there. If time stays in Jira, it is never billed. If engineers log it twice, they make mistakes and resent the overhead. Syncing worklogs is the obvious fix, but it touches money, so it needs more care than a typical ticket sync.

This guide covers the data model on both sides, how to map companies and boards, how to convert worklogs into billable time entries, and the edge cases that cause invoice disputes. The same design applies whether you write custom code against the ConnectWise and Jira REST APIs or use an integration platform. Where a concrete example helps, this guide uses ZigiOps, a standalone application that connects to both ConnectWise PSA and Jira through their APIs, so nothing has to be installed inside either system.

The two data models

Before mapping anything, line up what each system calls things. The models are different enough that a direct field-to-field copy does not work.

ConnectWise PSA and Jira concepts compared
Concept ConnectWise PSA Jira
Customer Company, with contacts and sites Project, or an organization in Jira Service Management
Unit of work Service ticket on a service board Issue in a project
Workflow Board statuses, configured per service board Workflow statuses and transitions, configured per project or issue type
Person doing the work Member User (account ID)
Time record Time entry with member, start and end or hours, work type, work role, billable option and notes Worklog with author, started timestamp, timeSpentSeconds and an optional comment
Commercial terms Agreement covering the company, with rules for what is billable or covered None natively; some teams use add-ons such as Tempo for accounts and billing attributes

The key gap is the last row. Jira has no concept of an agreement, a work type or billable status. Those values must come from the mapping, from defaults or from extra fields you add to Jira.

Step 1: Map companies to Jira projects or organizations

Every time entry in ConnectWise belongs to a ticket, and every ticket belongs to a company. So the first mapping is between ConnectWise companies and whatever represents the client in Jira.

  • One client, one Jira site or project: map the Jira project key to the ConnectWise company. This is the simplest and most common case when the MSP works in each client's own Jira.
  • One MSP Jira, many clients: if the MSP runs its own Jira Service Management instance, map Jira organizations or a "Client" custom field to ConnectWise companies.
  • Several clients in one project: avoid this if you can. If you cannot, require a mandatory client field on issues and validate it before any worklog is synced.
Example company mapping table
Jira source ConnectWise company Service board Default agreement
Project ACME (client's Jira Cloud site) Acme Manufacturing Development Services Acme Dev Retainer
Project NOVA (client's Jira Data Center) Nova Logistics Development Services Nova Time and Materials
MSP JSM, organization "Helios" Helios Health Managed Applications Helios Managed Services

Map on stable identifiers: the ConnectWise company record ID and the Jira project ID or organization ID, not names. Client names change after acquisitions and rebrands, and a name-based lookup that fails silently means time that never reaches an invoice.

How this works in ZigiOps

In ZigiOps, the company mapping is handled with conditional field mapping: a condition on the Jira project ID or organization sets the ConnectWise company, service board and default agreement for every ticket and time entry that follows. For an MSP that runs one Jira Service Management instance for many clients, adding a client is a configuration change on an existing connection. A client with its own Jira site is a new pair of instances, and ZigiOps licenses each pair with unlimited transactions between them, so high worklog volumes do not change the cost model.

Step 2: Link Jira issues to ConnectWise service tickets

Time entries need a ticket. There are two common patterns.

Pattern A: ticket per issue

Each Jira issue that the MSP works on gets a matching ConnectWise service ticket, created automatically when the issue meets a condition, for example when it is assigned to an MSP engineer or moved into a specific status. The ticket ID is stored on the Jira issue in a custom field, and the Jira key is stored on the ticket, for example in the summary prefix or a custom field. Worklogs then sync to the matching ticket.

This gives the best reporting: ConnectWise shows exactly which piece of work consumed the hours. It also lets the MSP's service desk see client work in their normal queues.

This is the standard correlation pattern in ZigiOps: the integration stores the ID of one record in a field of the other, so it keeps updating the right ticket and issue pair in both directions and never creates a second ticket for the same issue.

Pattern B: bucket ticket per period

One ConnectWise ticket per client per month (or per sprint) collects all time entries, and each time entry's notes include the Jira key and issue summary. This keeps ConnectWise boards clean when the MSP does many small tasks, but makes per-issue reporting harder and puts more weight on the notes field.

Pattern A suits project and development work. Pattern B suits retainer work with many short tasks. Some MSPs combine them: tickets for issues above a size threshold, a bucket ticket for everything else.

Step 3: Map board statuses to Jira statuses

With Pattern A, the ConnectWise ticket status should reflect the Jira issue's progress so the service desk and account managers see real status without logging into Jira. Board statuses are configured per service board, so the mapping is per board.

Jira status to ConnectWise board status mapping
Jira status ConnectWise board status Direction Notes
To Do New Jira to ConnectWise Set on ticket creation
In Progress In Progress Jira to ConnectWise Triggers when an MSP engineer starts work
Waiting for client Waiting Client Response Jira to ConnectWise Useful for SLA clocks if your board pauses on this status
In Review Pending Review Jira to ConnectWise Optional; many MSPs keep it as In Progress
Done Completed Jira to ConnectWise Do not close the ticket before the last worklog has synced
Any status Closed by MSP ConnectWise to Jira as a comment only The client owns the Jira workflow, so do not transition their issues

The direction column reflects a key principle for MSPs: the client owns its Jira workflow. An MSP closing a ConnectWise ticket for its own administrative reasons should never move a client's issue. Send that information as a comment, or not at all.

Step 4: Convert worklogs into time entries

This is the heart of the integration. A Jira worklog has an author, a started timestamp, a duration in timeSpentSeconds and an optional comment. A ConnectWise time entry needs a member, the ticket, a start time (and either an end time or actual hours), a work type, a work role, a billable option and notes. The table shows how to fill each field.

Jira worklog to ConnectWise time entry field mapping
ConnectWise time entry field Source Rule
Member Worklog author Look up by email or a maintained user mapping table; reject if no match
Charge to (ticket) Linked ConnectWise ticket on the issue Pattern A: ticket on the issue; Pattern B: current period bucket ticket
Time start Worklog started Convert to the member's time zone if your ConnectWise setup expects local time
Time end or actual hours timeSpentSeconds Divide by 3,600 for hours; apply rounding rules in one place only
Work type Issue type, a Jira field or a default per company For example Bug maps to "Remote Support", Story maps to "Development"
Work role Member's default role or a per-user mapping Roles often drive the rate, so keep this mapping under finance review
Billable option Agreement rules, work type or a Jira field Billable, do not bill, no charge or no default, depending on your setup
Agreement Company default agreement Override only through an explicit field; never guess
Notes Jira key, issue summary and worklog comment Format as "ACME-142 Fix export timeout: investigated logs"

In ZigiOps, each row of this table becomes a field mapping in the UI. Expressions handle the calculations, such as converting timeSpentSeconds to hours and building the notes text from the Jira key, issue summary and worklog comment, while conditional mapping picks the work type from the issue type or component. Keeping these rules in one visible mapping, rather than spread across scripts, makes them easier for finance to review.

Who decides what is billable?

Billable status is a commercial decision, so it should not be left to an engineer's comment. Typical approaches, from simplest to most flexible:

  1. Agreement default: let the ConnectWise agreement and work type rules decide. The integration only provides the work type.
  2. Work type mapping: map Jira issue types or components to work types that are marked billable or non-billable.
  3. Explicit Jira field: add a "Billing" select field to issues (for example Billable, Included in agreement, Non-billable) that the MSP's lead sets once per issue.
  4. Worklog attributes: if the client uses a time-tracking add-on such as Tempo, worklog-level attributes may carry billing information. Check what the add-on exposes through its API before relying on it.

Rounding and minimums

Many MSP contracts round time to fixed increments or apply minimum charges. Apply rounding in exactly one place. If ConnectWise already rounds based on agreement settings, send the exact duration. If it does not, round in the integration and record the original duration in the notes so disputes can be resolved. Never round in both places.

Step 5: Handle edits, deletions and late entries

Worklogs are not immutable. Engineers fix typos in durations, move worklogs between issues and delete duplicates. Each case needs a rule.

Worklog change handling
Jira event ConnectWise action Safeguard
Worklog created Create time entry; store the time entry ID against the worklog ID Idempotency check on worklog ID to prevent duplicates on retries
Worklog updated Update the linked time entry Skip if the entry is already approved or billed; alert the billing team instead
Worklog deleted Delete or zero the linked time entry Same billed check; never delete billed time automatically
Worklog logged for a past date Create time entry with the original date If the period is closed in ConnectWise, route to a review queue
Worklog on an issue with no linked ticket Create the ticket first (Pattern A) or use the bucket ticket (Pattern B) Reject if the company mapping is missing, and notify the MSP lead

The billed check is critical. Once a time entry is approved in a time sheet or included on an invoice, changing it from an integration creates mismatches between invoices and records. The integration should detect that state and notify a person rather than edit.

When you set this up in ZigiOps, configure the create and update operations separately and add filter conditions for the cases that need human review, so that late entries, deletions and changes to approved time are routed to the billing team rather than pushed automatically.

Step 6: Plan the reverse direction carefully

Should time logged in ConnectWise flow back to Jira? Sometimes. If MSP engineers log time directly on ConnectWise tickets, for example for calls or meetings, clients may want that time visible on their Jira issues. If you sync it, write it as a Jira worklog with the integration user as author and the real member name in the comment, and mark it so the integration never syncs it back to ConnectWise. Many MSPs choose one-way sync from Jira to ConnectWise to avoid loops and double counting, and expose ConnectWise totals to clients through reports instead. If you do sync both ways, ZigiOps ignores changes made by its own integration user, which keeps synced worklogs from echoing back as new time entries.

Testing checklist

  • Log a worklog on an issue in each mapped project and confirm the time entry lands on the right company, ticket and agreement.
  • Log time as a user with no member mapping and confirm the entry is rejected with a clear alert.
  • Log time on different issue types and confirm work types and billable options.
  • Edit a worklog's duration and confirm the time entry updates.
  • Edit a worklog whose time entry has been approved and confirm the integration alerts instead of editing.
  • Delete a worklog and confirm the entry is removed or zeroed.
  • Log time for a previous week and confirm closed-period handling.
  • Run the same webhook twice and confirm no duplicate time entries.
  • Compare total hours per company for a week in Jira and ConnectWise; they should match after rounding.

Troubleshooting

Common ConnectWise Jira time sync problems
Symptom Likely cause Fix
Duplicate time entries Retries without an idempotency check Store and check the Jira worklog ID before creating
Hours differ between systems Rounding applied twice, or time zone shift across midnight Round in one place; normalize to UTC before converting
Time on the wrong company Name-based company lookup, or issue moved between projects Map on IDs; handle issue moves by re-pointing future entries only
Time entries rejected by ConnectWise Missing work type, inactive member or closed agreement Validate required fields before sending and log the API error
Client sees MSP admin status changes in Jira Status sync configured both ways Sync ConnectWise status to Jira as comments only, or not at all

Choosing how to implement it

Options include custom code against the ConnectWise PSA REST API and Jira's worklog endpoints and webhooks, general automation tools for simple one-way flows, and dedicated integration platforms. ZigiOps supports both ConnectWise PSA and Jira, is 100% no-code and does not store the transferred data, which matters because worklog comments often contain client information. Other platforms, such as ONEiO, are also worth checking for current ConnectWise support.

For MSPs, evaluate four things: whether the tool keeps a persistent link between worklog IDs and time entry IDs, whether it can apply per-company mapping tables, whether it can detect billed entries, and whether it works across many client Jira instances without a separate setup for each. In ZigiOps, the first two are covered by correlation fields and conditional mapping, and the export, import and cloning of integrations makes it practical to reuse one tested configuration across client instances. Test the billed-entry handling in a sandbox with whichever tool you choose.

Frequently asked questions

Can Jira worklogs sync automatically to ConnectWise time entries?

Yes. An integration can listen for worklog events in Jira and create matching time entries on the linked ConnectWise service ticket, filling in member, work type, work role, billable option and agreement from mapping rules.

How do I integrate ConnectWise with a client's Jira without changing their workflow?

Sync status from Jira to ConnectWise only, send any ConnectWise information to Jira as comments, and use a dedicated integration user with the minimum project permissions the client approves.

Can ZigiOps sync Jira worklogs to ConnectWise time entries?

ZigiOps supports both Jira and ConnectWise PSA, and the worklog-to-time-entry mapping described in this guide can be configured in its no-code UI with field mapping, conditional mapping and expressions, plus correlation IDs to prevent duplicates. Confirm the exact entities available for your versions during setup.

Which system should decide whether time is billable?

ConnectWise, through agreements and work types, or a dedicated billing field in Jira set by the MSP lead. Avoid inferring billable status from worklog comments.

What happens if an engineer edits a worklog after it has been billed?

A well-designed integration detects that the time entry is approved or invoiced and alerts the billing team instead of changing it automatically.

Should one ConnectWise ticket be created for every Jira issue?

For development and project work, a ticket per issue gives the clearest reporting. For retainers with many small tasks, a monthly bucket ticket per client with the Jira key in the notes can be simpler.

How do I avoid duplicate time entries?

Store the Jira worklog ID with each ConnectWise time entry and check it before every create, so retries and redelivered webhooks update instead of duplicating.

Key takeaways

  • A ConnectWise Jira integration for MSPs is a billing integration first and a ticket sync second.
  • Map companies to Jira projects or organizations on stable IDs, and give every company a default service board and agreement.
  • Translate each worklog into a full time entry: member, ticket, start, hours, work type, work role, billable option, agreement and notes.
  • Decide who controls billable status, and apply rounding in exactly one place.
  • Handle edits, deletions and late entries explicitly, and never change billed time automatically.
  • Respect the client's Jira workflow: sync status into ConnectWise, not back into the client's issues.
  • A no-code platform such as ZigiOps keeps company, work type and billing rules as visible configuration, so they can be reviewed and reused instead of being buried in custom code.