IntegrationsCRM / PSA

ConnectWise PSA

Cotillion's ConnectWise integration syncs Opportunities, their forecast line items and products, Companies, Contacts and Notes from your ConnectWise PSA instance into a single, standardized deal record. Once synced, the deals appear in your Cotillion workspace where you can register them against vendor portals (AWS Partner Central, Microsoft Partner Center, …) with a single action. For your Trust Profile it also reads your projects and the SLA results of your service tickets.

Your business data is read-only to us. Cotillion never creates, edits or deletes an opportunity, company, contact or note. There is exactly one thing it writes, and it writes it about itself: a Callback registration under System, which is how ConnectWise notifies Cotillion when a company, contact or opportunity changes instead of Cotillion re-reading everything on a timer. Cotillion creates those callbacks pointing at its own endpoint, and deletes them again when you disconnect the integration. See Step 1.

Before you begin: you'll create a dedicated API Member in your ConnectWise PSA with a read-only Security Role, and generate an API key pair. The whole setup takes about 10 minutes.

At a glance

ItemValue
AuthenticationAPI Member key pair – Company ID + Public Key + Private Key
API surfaceConnectWise PSA REST API v3.0 (/v4_6_release/apis/3.0)
DirectionRead-only on your data; creates and removes its own System Callbacks
CredentialsAWS KMS-encrypted at rest, never logged
RegionYou pick your ConnectWise cloud region (Australia / Europe / North America)

Setup

A dedicated Security Role keeps the API Member scoped to just the data this integration reads.

In ConnectWise PSA:

  1. Open System → Security Roles and click New to add a role; name it Cotillion Read-only (or similar).
  2. Each module row has four permission columns (Add / Edit / Delete / Inquire), each a level dropdown (None … All). Set Inquire = All on the modules Cotillion reads, and leave Add / Edit / Delete = None on all of them:
    • Companies – Company Maintenance, Contacts. Unlocks company/companies, company/contacts and company/companies/{id}/notes; these are the customer, the contacts and the company notes attached to every deal.
    • Sales – Opportunity and Closed Opportunity. Unlocks sales/opportunities and sales/opportunities/statuses, so Cotillion reads open deals plus won/lost ones and resolves their status from ConnectWise's own status flags rather than the editable status name; and sales/opportunities/{id}/forecast and sales/opportunities/{id}/notes, the line items and the notes of each deal.
    • Procurement – Products. Unlocks procurement/products, which carries the product description and customer-facing description for each forecast line. Without it a line item reaches the vendor payload without its product text, and the registration is materially thinner.
    • Project – Project Headers. Unlocks project/projects and project/statuses: your projects and which of their statuses count as closed, which the Trust Profile reports as delivered projects.
    • Service Desk – Service Tickets. Unlocks service/tickets, read for the tickets that carry a service level agreement, which the Trust Profile reports as SLA results.
    • System – Member Maintenance and the System Reports / API permission that backs the connection check. Unlocks system/members (used to resolve opportunity owners and note authors) and system/info (the credential check on Test & Connect).
  3. Callbacks: the one grant that is not Inquire. The API Member must also be able to create and delete Callbacks under System. This is how ConnectWise pushes company, contact and opportunity changes to Cotillion: Cotillion registers a callback pointing at its own endpoint (POST system/callbacks) and removes it again when you disconnect (DELETE system/callbacks/{id}). It never touches a callback it did not create, and it registers nothing that points anywhere other than Cotillion. With this permission withheld the integration still works (every change is then found by the normal 5-minute sync instead of being announced), but the registration attempt will fail and be retried.
  4. Save.

Sources (official ConnectWise docs): Create an API Member & Security Role (ConnectWise Developer Network) · ConnectWise Developer Network: REST API reference (endpoint → module mapping).

Why read-only on your data. Our integration never creates, edits or deletes an opportunity, company, contact or note. Granting Add / Edit / Delete on those modules goes beyond what is required. The Callbacks grant in step 3 is the single exception, and it only lets the API Member manage notification registrations addressed to Cotillion.

Step 2: Create an API Member

  1. Open System → Members, then switch to the API Members tab.
  2. Click New to create an API-only Member (it holds no license and has no interactive UI login).
  3. Set its Role ID to the Cotillion Read-only role from Step 1, and fill the required Location / Business Unit fields.
  4. Save.

Step 3: Generate the API key pair

  1. Open the API Member you just created and go to its API Keys tab.
  2. Click New, give the key a description (e.g. Cotillion), and save.
  3. Copy the Public Key and the Private Key.

Keep these values handy: the Private Key is shown only once by ConnectWise. If you lose it, you'll need to generate a new key pair.

Step 4: Find your Company ID

Your Company ID is the short company code you type on the ConnectWise PSA login screen (not your email). If you're unsure, it also appears in your instance URL.

Also note your region: it's the prefix of your ConnectWise login URL (na. / au. / eu.myconnectwise.net). You'll pick it from a dropdown in the next step. (Cotillion can't detect it for you: ConnectWise's company lookup only answers on the matching regional host, so the region has to come from you.)

Self-hosted / on-premise ConnectWise is not supported. The integration connects to the ConnectWise cloud regions in the dropdown (myconnectwise.net); a ConnectWise instance on your own server (your own domain) cannot be connected.

Step 5: Connect in Cotillion

  1. Sign in to your Cotillion workspace at cotillion.indyrct.com.
  2. Open CRM / PSA in the sidebar → Connect → ConnectWise PSA.
  3. Enter your Company ID, Public Key, and Private Key from the steps above, and choose your ConnectWise region (Australia / Europe / North America) from the dropdown.
  4. Click Test & Connect.

What happens automatically:

  • ✅ Cotillion builds your API host from the region you chose.
  • ✅ Verifies the credentials against the ConnectWise PSA REST API.
  • ✅ Encrypts them with an AWS KMS envelope before storing.
  • ✅ Starts a one-time backfill sync, then schedules recurring updates.

Step 6 (optional): Exclude individual opportunities from the sync

Some opportunities should never appear in Cotillion: internal-only forecasts, experiments, or deals you don't want surfaced for vendor registration. You can opt them out with a custom field on the Opportunity.

In ConnectWise PSA:

  1. Open System → Setup Tables → Custom Fields, choose the Opportunity screen, and click New.
  2. Set Field Type = Checkbox and Caption = Cotillion Exclude From Sync, then save.
  3. Tick it on any opportunity you want hidden.

On the next sync (within ~5 minutes), Cotillion skips the AI mapping for that opportunity entirely.

Do not rename this caption later. Cotillion matches the field by its exact caption, so a rename stops the exclusion, and the opportunity would start syncing again on the next pass.

Reversible. Un-tick the field to re-include the opportunity on the next sync. Cotillion does not delete previously-synced deal data when you flip the flag on: it stops refreshing it, and flipping it off brings the data back up to date.

How the sync works

CadenceWhat
Company / contact / opp editsAnnounced by callback, when the Callbacks grant is in place: ConnectWise announces each change and Cotillion re-reads just that record, without waiting for a scheduled sync. The scheduled sync below is the safety net behind it.
Members directory refreshPeriodically: Cotillion refreshes the ConnectWise members directory it uses to resolve opportunity owners and note authors.
Opportunity syncEvery 5 minutes per organization: opportunities + their forecast line items + companies + contacts + notes. Opportunity statuses, stages, and types are resolved inline on every sync straight from ConnectWise (status flags + reference labels); there is no separate periodic refresh for them, so a rename is reflected on the next sync.

The integration respects ConnectWise's per-instance rate limits: each sync is rate-limited per credential, with backoff on throttling, and outbound traffic is logged in our operational dashboards for audit.

Which opportunities Cotillion keeps

Cotillion keeps the opportunities you could register with a vendor, and the ones it is already tracking. In practice:

  • Open opportunities are synced and appear in Deals.
  • An opportunity that closes while Cotillion is tracking it stays. That is exactly when the outcome has to reach the vendor, when the vendor's verdict comes back, and when a won deal becomes eligible for an incentive. It moves out of the "requires action" view and stays under the registered deals.
  • Opportunities that were already closed before Cotillion saw them are not kept. Editing an old closed opportunity in ConnectWise does not pull it in either. Your closed deal history stays in ConnectWise.

What gets synced and how it stays stable

Each sync turns every opportunity into the deal you see under Deals in Cotillion. Because ConnectWise keeps deal value on the opportunity's forecast (not on the opportunity header), Cotillion reads the forecast line items and rolls them up into a single amount, currency, and per-line-item detail. Won / lost / open status is read from ConnectWise's status flags, not the editable status name, so it stays correct even if you rename your statuses.

Two guarantees Cotillion holds across syncs:

  • Customer and contact identity are stable. When you rename a company in ConnectWise, Cotillion picks up the new name on the next sync, but the same customer keeps the same internal identity: every opportunity that pointed to it before still points to it after. The same applies to contacts.
  • Disconnect-then-reconnect is non-destructive. If you remove the ConnectWise integration in Cotillion and add it back within 30 days, your existing opportunities re-attach to the new connection without losing their vendor-registration history or per-line-item state.

Audit trail

Cotillion keeps an immutable record of every payload submitted to a vendor. The record captures exactly what was sent at submission time, independent of subsequent edits in ConnectWise or Cotillion.

Reference

ConnectWise's official help if your UI differs from the steps above:

Troubleshooting

Authentication fails on Test & Connect

First, check the region you picked matches your ConnectWise login URL (the na. / au. / eu. prefix). Correct keys against the wrong region fail auth and read like bad keys. Leave the keys alone and re-pick the region.

If the region is right, the Company ID, Public Key, or Private Key was mistyped, or the API Member's Security Role is missing read access. Regenerate the key pair in ConnectWise (the Private Key cannot be retrieved later) and re-check the role from Step 1.

Deal amounts are missing

ConnectWise keeps deal value on the opportunity forecast. If amounts are blank, confirm the API Member's role can read the opportunity's forecast / products, and that the opportunity actually has forecast line items.

Line items have no product description

The Procurement → Products Inquire permission is missing from the Security Role. The amounts still come through from the forecast, but the product name and customer-facing description do not, which makes the registered deal thinner than it should be.

Changes take up to 5 minutes to appear

That is the scheduled sync doing the work, which means the Callback registration did not succeed. Check that the API Member's role permits creating Callbacks under System (Step 1, item 3). Nothing is lost either way; the sync picks up every change on its next pass.

Rate limit reached

ConnectWise returned a 429 (rate-limited) response. Cotillion automatically backs off and retries; no action required.

An opportunity is missing from Cotillion

Check the opportunity's Cotillion Exclude From Sync custom field: if it's ticked, the opportunity is intentionally hidden (see Step 6). Un-tick it to bring it back on the next sync (within ~5 minutes).


For Cotillion-side issues, email support@indyrct.com.

On this page