The Integration That “Works” and the Integration That Works
There are two kinds of integrations, and most platforms don’t distinguish between them clearly.
The wrapping-API-calls kind. The platform exposes HTTP tools: GET /v2/tickets, POST /v2/tickets, PATCH /v2/agreements/{id}. The user (or the user’s AI) figures out the right sequence of calls. Authentication, pagination, and rate limiting are the user’s problem. If the API has MSP-specific concepts like “Agreement” that aren’t generic “record” types, the integration doesn’t know or care.
The speaks-the-domain kind. The platform understands that a ConnectWise Agreement is not just a record — it’s a billing structure that governs whether time entries count toward a retainer or are billable at T&M rates. It understands that a Configuration isn’t just a CRUD object — it’s the MSP’s inventory of client-tracked assets that the RMM feeds into, which triage AI needs to read to generate contextual responses. It understands that bulk ticket-time writes are not “POST the same endpoint N times” — they’re a single transactional operation that prevents double-billing on retry.
For ConnectWise Manage, we built the second kind.
What MSPs Actually Do With ConnectWise
Before writing any code, we interviewed 14 small MSPs (4-25 technicians) about what they actually do inside ConnectWise on a typical day. The pattern was consistent:
-
Triage inbound tickets. Service desk reads the ticket, assigns priority, routes to the right board. Needs: read the ticket, read the client’s Configurations (so the AI can draft context-aware responses), read the Agreement (so the AI knows the SLA tier), write an internal note with the drafted response for tech review.
-
Log time against tickets. Techs spend the end of every day (or Friday afternoon) writing time entries. One tech might have 30-50 entries across 15 tickets. The typing is the work. Needs: bulk write time entries with transactional semantics so a retry doesn’t double-post.
-
Reconcile billable vs. retainer time. The same time entry means different things against a T&M Agreement vs. a retainer Agreement. Needs: read Agreements and use them to classify time entries at write-time.
-
Keep Configurations in sync. RMM and monitoring tools generate Configuration updates constantly. Ingesting those into ConnectWise without creating duplicates or overwriting user-entered notes is a constant minor irritation. Needs: deduplication at the integration layer, not “every feed has its own dedup logic.”
-
Generate QBR / client-review packets. Monthly or quarterly, pull Agreement details, Configuration inventory, ticket summary, SLA performance. Needs: read all of the above in a structured way so an AI can summarize.
None of these is “write generic CRUD against a REST endpoint.” All of them depend on the integration understanding domain concepts.
What We Built
The integration ships with these first-class surfaces:
Configurations
Read and update ConnectWise Configurations as structured objects, not JSON blobs. When an RMM feeds a Configuration update (software inventory, hardware change, patch status), the integration:
- Deduplicates against existing Configurations for the same client + asset
- Preserves user-entered notes that aren’t covered by the feed
- Writes a single transactional update, not N partial updates
When AI is drafting a ticket response, it can read relevant Configurations via a structured tool — not by scraping the ConnectWise UI or parsing API responses.
Agreements
Read and reason about Agreements at the domain level. An Agreement has:
- A billing model (retainer, T&M, flat-fee, ticket-based)
- Included coverage (which service boards, which configurations, which work types)
- SLA tier (response time, resolution time)
- Rate tables (tech type → billable rate)
The integration surfaces all of these to AI and operators as structured data. When an MSP’s AI is generating a ticket response, it knows whether the client is under a “Gold” or “Bronze” SLA and drafts accordingly.
Ticket Time Bulk Operations
The money feature for techs who lose 30 minutes a day to time entry.
- Bulk write — submit 50 time entries for one tech’s day in a single operation
- Transactional — if any entry fails, the batch rolls back cleanly (no half-written partial state)
- Deduplication — if the operator retries due to a timeout, the second attempt detects the first’s partial state and completes it rather than double-posting
- AI-assisted marking — time entries written by AI carry a visible
[AI-Assisted]prefix. The MSP chooses whether to disclose this to the client on invoices, but the audit trail is always there.
Rate Limiting and Retry
ConnectWise Manage has per-client API rate limits that differ by licensing tier. The integration:
- Respects the per-client rate limit as a first-class concept, not “try again on 429”
- Uses a token-bucket per client tenant, not a global counter
- Implements idempotent retries with a dedup key derived from the request payload — so a retry due to a network blip doesn’t write twice
Cross-Account Isolation
The integration ships with a cross-account security test suite that specifically verifies: an action scoped to Client A cannot read or write data for Client B, even if the API keys in use have broader access. The test suite is part of our CI and blocks any regression.
This is the feature the auditor cares about. When SOC 2 or HIPAA compliance is on the line, “we tested that tenant isolation works” is the difference between a clean audit and a finding.
What AI Sees
The integration is exposed to JieGou’s AI layer via structured MCP tools. A recipe or workflow that handles ticket triage can:
read_configurations(client_tenant: "Acme Corp", filter: { active: true })
→ returns structured list of Configurations
read_agreement(client_tenant: "Acme Corp", agreement_id: "AGR-123")
→ returns structured Agreement with billing model + SLA tier
draft_ticket_response(ticket_id: "T-456", context: { configurations, agreement })
→ AI generates response aware of client's specific context
submit_for_approval(draft, action: "post_to_ticket_notes")
→ enters the shadow-mode approval queue
[operator reviews and approves]
write_time_entry(ticket_id, hours, description, billable: from_agreement_rules)
→ transactional write through the integration
The AI doesn’t need to know ConnectWise’s HTTP API exists. It composes domain actions. The integration translates.
What It Took to Build This
More than a REST wrapper, less than a green-field PSA. Calendar-wise, roughly two sprints of engineering focused specifically on ConnectWise semantics, plus ongoing refinement as pilot MSPs surface edge cases.
The alternative — a generic API wrapper — would have taken one sprint. It would have worked for the happy path. It would have failed for the bulk-time case, the retry-dedup case, the Agreement-rate-lookup case, and the tenant-isolation-verified case.
For a vertical like MSPs where PSA integration depth is the buying criterion, one sprint of additional integration work is the correct trade.
What’s Next
In the current roadmap:
- ConnectWise Automate integration — the RMM side of the CW suite; same governance model
- ConnectWise PSA reporting — mirror the report structure MSPs already expect from CW, generated by AI on a schedule
- Autotask PSA integration — the other major PSA, same first-class-surfaces pattern
If you’re an MSP using ConnectWise Manage and our approach sounds right, book a demo and we’ll run through a live integration walkthrough. If you’re on a different PSA and want this depth of integration with your tooling, tell us — the roadmap responds to named MSPs.