User guide
MSP Multi-Tenancy and Co-Management
Looking for what it does rather than how to use it? Read the Co-management overview .
What it is
Co-management lets more than one MSP service the same client account at the same time, and lets that client change or drop its MSPs without moving any data. One MSP is the primary — it bills and brands the client — and any number of others can be collaborators, who service the same tickets, assets and schedules without taking the revenue.
Every relationship is opened by one side and accepted by the other. Nothing grants access until both have agreed.
Concepts
| Term | What it is |
|---|---|
| Account | The tenant. An MSP has one; each of its managed clients has its own, separate one. Organizations, tickets, assets, invoices and contracts hang off an Account. |
| Managing MSP | An MSP account that services a client account. Recorded as an AccountManagementLink. |
| Primary | The single MSP that bills the client, owns its email brand and legal-sender identity, and whose tier its entitlements fall back to. |
| Collaborator | An additional servicing MSP. Same reach over the client’s work, no revenue, no identity control. |
| Link status | PENDING (awaiting the other side’s answer), ACTIVE (in effect), REVOKED (ended; kept for audit, grants nothing). |
| Direction | Which side opened it — MSP_INVITED or CLIENT_REQUESTED. A PENDING link is only actionable by the side that did not open it. |
| Partner code | An MSP’s account slug. A client types it to ask that MSP to take it on. There is no partner directory — you can only use a code you were given. |
| Independent | An account with no primary and no active links. It keeps every organization, ticket, asset, invoice and contract. |
Only ACTIVE links grant anything. PENDING and REVOKED grant nothing anywhere in the product.
Primary versus collaborator
The distinction is not a permission level — it is a different relationship.
| Concern | Primary | Collaborator |
|---|---|---|
| Sees the client in its client list | ● | ● |
| Opens the client detail page | ● | ● |
| Services tickets, assets, calendars, projects | ● | ● |
| Sees the client’s MRR | ● | — |
| Edits the client’s name, slug, domain, status | ● | — |
| Invites the client’s contacts to the portal | ● | — |
| Bills the client / owns its email brand | ● | — |
| Client’s entitlements fall back to its tier | ● | — |
| Releases the client to independent (offboard) | ● | — |
| Leaves the client on its own | ● | ● |
Roles and permissions
| Action | Portal | Minimum role |
|---|---|---|
| Read your own partner code | MSP | MSP administrator |
| Invite yourself onto a client | MSP | MSP administrator |
| List/withdraw outbound invitations | MSP | MSP administrator |
| List/accept/decline inbound requests | MSP | MSP administrator |
| See a client’s servicing MSPs | MSP | MSP administrator |
| Leave a client | MSP | MSP administrator |
| Release a client to independent | MSP | MSP administrator (primary only) |
| View your client list / a client | MSP | MSP technician |
| Edit a client’s profile | MSP | MSP administrator (primary only) |
| See who manages your account | Org | organization administrator |
| Ask an MSP to take you on | Org | organization administrator |
| Accept / decline an invitation | Org | organization administrator |
| Change your primary MSP | Org | organization administrator |
| Remove an MSP / become independent | Org | organization administrator |
power user and CUSTOMER cannot reach any of the client-side routes. This is deliberate — every one of them changes who can read the tenant’s data.
Walkthrough — a client engages an MSP
Use this when the account already exists (it signed up on its own, or a previous MSP released it) and wants an IT partner.
- The MSP reads its partner code. MSP portal → Clients. The code is shown at the top of the Client co-management requests panel, with a Copy button. It is the MSP account’s slug.
- The MSP gives the code to the client — email, onboarding pack, whatever. There is no directory to look it up in, which is what stops anyone opening a relationship with an account they were not invited to approach.
- The client sends the request. Org portal → Settings → Managing MSPs → Invite an MSP. Paste the code and press Send request. Case and surrounding whitespace do not matter.
- The request is now pending. It appears under Requests you sent with a Withdraw button. The MSP has no access to anything yet.
- The MSP’s admins get a notification and the request appears in MSP portal → Clients → Client co-management requests.
- The MSP accepts. The client becomes an
ACTIVEcollaborator relationship: it appears in the MSP’s client list, and its tickets, assets and schedules are reachable immediately.
Accepting does not make the MSP primary. Billing and branding are the client’s separate decision — see §7.
Walkthrough — an MSP invites an existing client
Use this when the MSP has the client’s organization id (for example, the client gave it, or an outgoing MSP handed it over).
- The invitation is created
PENDINGand appears under Clients → Pending co-management invitations, with a Withdraw button. - The client’s admins are notified, and see it at Settings → Managing MSPs → Pending invitations, with Accept and Decline.
- On accept, the MSP becomes an
ACTIVEcollaborator.
An MSP cannot accept its own invitation, and a client cannot accept its own request. Each PENDING link is answerable only by the other side.
A client an MSP provisions (MSP portal → Clients → Onboard Client) skips all of this: the MSP created the account, so it gets a
PRIMARY,ACTIVElink immediately with no consent step.
Walkthrough — adding a second MSP
There is nothing extra to do. A client that already has a primary MSP follows §4 or §5 with the second MSP’s partner code. Both relationships are then ACTIVE:
- the primary keeps billing, branding and identity control;
- the new MSP is a collaborator and sees the client in its own portal;
- the client’s Managing MSPs page lists both, labelled Primary and Collaborator.
The primary can see the collaborator on the client detail page’s MSPs tab, but cannot remove it — only the collaborator itself, or the client, can end that relationship.
Walkthrough — changing your primary MSP
Org portal → Settings → Managing MSPs.
- The MSP you want to promote must already be Active. Press Make primary on its row.
- Its link becomes
PRIMARY, and your account’s primary manager changes to it. Billing, email branding and entitlement fallback move with it. - The outgoing primary is demoted, not evicted. It keeps servicing you as a collaborator until you remove it or it leaves. Remove it separately if that is what you want.
The target must be an MSP partner account. Promoting an account that is not one is refused with “That account is not an MSP partner and cannot be your primary”.
Walkthrough — leaving, and being released
Three separate actions, from three different places.
A client removes one MSP. Org portal → Settings → Managing MSPs → Remove on that row. If it was the primary, your account is left with no primary.
A client leaves every MSP. Same page → Become independent. Confirms, then revokes every link and clears the primary. Your account keeps every organization, ticket, asset, invoice and contract — nothing moves, because the account was always yours.
An MSP leaves a client. MSP portal → Clients → the client → MSPs tab → Leave client on your own row. Only your own link ends.
A primary MSP releases a client. Same tab → Release to independent. This ends every MSP relationship on that client, not just yours, and the client becomes independent with its data intact. Only the primary can do this; a collaborator gets “Only the primary MSP can offboard a client”.
Going independent leaves the account with no MSP tier to fall back on. If its entitlements were being carried by its primary MSP’s plan, they revert to its own.
What a collaborator can and cannot do
A collaborator has the same servicing reach as the primary:
- the client appears in Clients, and the client detail page opens;
- the client is counted in the MSP dashboard’s client tiles;
- its tickets are listable, readable, creatable, assignable and commentable;
- its assets appear in the asset list and in the asset summary tiles;
- its calendar events appear in the MSP calendar;
- its people are selectable as requesters and assignees;
- its queues, SLA policies and routing rules apply as the primary’s do.
It does not get:
- MRR. The client’s recurring revenue reads
0for a collaborator, in the client list, the client detail page and the dashboard revenue tile. That figure belongs to whoever bills the client. - The Edit Client button is not rendered for a collaborator.
- Portal invitations. Inviting a client contact into the client’s own organization is primary-only and answers 403.
- Offboarding. Primary-only, 403.
The client detail page shows “Co-managed — another MSP bills and brands this client” in its header, and the client list marks the row Co-managed.
Notifications
Sent in-app to the administrators who can actually act on them — a client-side event goes to the client’s organization administrators (and any MSP/platform admins on that account), an MSP-side event to the MSP’s MSP administrators.
| Event | Goes to | Type |
|---|---|---|
| MSP invited a client | Client | MANAGEMENT_INVITE_RECEIVED |
| Client requested an MSP by partner code | MSP | MANAGEMENT_REQUEST_RECEIVED |
| Client accepted an invitation | MSP | MANAGEMENT_LINK_ACCEPTED |
| MSP accepted a request | Client | MANAGEMENT_LINK_ACCEPTED |
| Client declined an invitation | MSP | MANAGEMENT_LINK_DECLINED |
| MSP declined a request | Client | MANAGEMENT_LINK_DECLINED |
| Client removed an MSP | MSP | MANAGEMENT_ACCESS_ENDED |
| Client went independent | MSP | MANAGEMENT_ACCESS_ENDED |
| MSP released a client | Client | MANAGEMENT_ACCESS_ENDED |
Withdrawing your own pending item notifies nobody — there was no decision for anyone else to make.
Delivery is fire-and-forget.
Audit trail
Every transition writes an AuditLog row with entityType = "AccountManagementLink", visible at Settings → Audit.
| Action | Written when |
|---|---|
MANAGEMENT_INVITE_SENT | An MSP invites itself onto a client |
MANAGEMENT_REQUEST_SENT | A client requests an MSP by partner code |
MANAGEMENT_LINK_ACCEPTED | Either side accepts |
MANAGEMENT_LINK_DECLINED | Either side declines |
MANAGEMENT_INVITE_WITHDRAWN | Either side withdraws its own pending item |
MANAGEMENT_LINK_REVOKED | An active relationship is ended by either side |
MANAGEMENT_PRIMARY_CHANGED | A client changes its primary MSP |
MANAGEMENT_CLIENT_OFFBOARDED | A primary releases a client to independent |
MANAGEMENT_WENT_INDEPENDENT | A client leaves every MSP |
Both sides get a row. The client’s trail and the MSP’s trail each record the event under their own accountId, so neither party depends on the other’s log retention to evidence when access started or ended.
An audit write that fails is logged and swallowed — it never rolls back a consent decision the user has already been shown as complete.
Plan tiers
Co-management carries no plan gate. Every capability in this guide works on every tier, including Free, for MSP and customer plans alike. There is no limit on the number of collaborating MSPs on an account.
The one tier interaction is indirect: a managed client’s entitlements can fall back to its primary MSP’s tier. Changing primary changes which tier that is; going independent removes the fallback.
Troubleshooting
| What you see | Cause |
|---|---|
Partner code (404) when requesting an MSP | The code matches no MSP partner account. An unknown code and a non-MSP account give the same answer on purpose. |
This MSP already manages your account (409) | It is already your primary, or already holds an active link. |
A request or invitation with this MSP is already pending (409) | A decision is already outstanding, in either direction. Withdraw it first if you want to start over. |
You already service this client (409) when inviting | You are already the primary or hold an active link. |
An invitation is already pending (409) | You already invited this client and they have not answered. |
organizationId must match the :orgId path parameter (400) | The body and the URL disagree. They must name the same organization. |
Cannot invite your own account (400) | The organization belongs to your own account. |
Cannot manage the platform account (400) | The target is the platform account, which is never managed. |
Account is not an MSP partner (403) | isMspItPartner is false on your account. Only MSP partner accounts can service clients. |
You sent this request — the MSP has to accept it (409) | You tried to accept your own request. Only the other side can answer. |
Invitation (404) on withdraw | The link is not yours, does not exist, or is an inbound request — decline it instead. |
Request (404) on accept/decline | The link is not addressed to you, does not exist, or is your own outbound invitation. |
Invitation is no longer pending / is not pending (409) | The other side already answered. Reload to see the real state. |
Only an active MSP can be made primary (400) | The link is pending or revoked. It must be ACTIVE first. |
That account is not an MSP partner and cannot be your primary (400) | The target account’s isMspItPartner is false. |
Only the primary MSP can offboard a client (403) | You are a collaborator. Use Leave client to end your own relationship. |
Link is already revoked (409) | Already ended. Reload. |
| Client list is empty for a co-managing MSP | The link is PENDING, not ACTIVE. Only ACTIVE grants anything. |
| Edit Client button missing | You are a collaborator. Identity edits belong to the primary. |
Client shows MRR 0 | Same. Revenue is reported only to the MSP that bills the client. |
Limits and known behaviour
- A collaborator’s reach is not scoped. An
ACTIVElink grants the same servicing visibility across the whole client as the primary has. There is no way to limit a collaborator to specific organizations, queues or asset types. - Exactly one primary.
Account.managedByAccountIdis a single FK. An account has one primary or none. - Removing your primary leaves you with none. Revoking the primary’s link clears the FK; it does not promote a collaborator. Promote one explicitly.
- No partner directory. A client can only reach an MSP whose partner code it has been given, and an MSP can only invite a client whose organization id it has. This is what keeps either side from approaching accounts it was never introduced to.
- The history survives in the link rows and in the audit trail, but no UI renders it.
invitedByPersonIdis recorded but not displayed. It is stored on every invite and request for audit; no screen shows who sent it.- Escalations with several MSPs and no primary go to the platform. A client’s “get MSP help” escalation is addressed to its primary, or to a single active link if that is the only one. With several collaborators and no primary there is no basis for choosing, so the platform triages it rather than the wrong MSP receiving it.
- Client-side billing surfaces are per-MSP. Credit accounts and similar are scoped to the MSP that created them, so each servicing MSP sees its own, not the primary’s.
- Notifications are in-app only. There is no email for co-management events.
- Independence does not archive anything. Going independent revokes links and clears the primary. Data, users, tickets and invoices are untouched.