Connect your ConnectWise Manage instance to MSPortal.ai and choose what it syncs
This guide walks you through connecting your ConnectWise Manage instance to MSPortal.ai. Connecting an integration is an MSP staff task. Company users do not administer this connection.You set ConnectWise up first, then work through the tasks on the ConnectWise Manage connection page. See Connect and manage integrations for the tasks every connection shares.
Prerequisites
Before you begin, ensure you have:
Admin access to both ConnectWise Manage and MSPortal.ai
Your ConnectWise company ID (visible on the ConnectWise login screen)
Access to create API members and security roles in ConnectWise
Part 1: Configure ConnectWise Manage
Before connecting to MSPortal.ai, you need to create an API member and security role in ConnectWise.
Create Security Role
1
Access System Settings
Login to ConnectWise Manage and navigate to System > Security Roles.
2
Create Security Role
Create a security role named “MSPortal”. Expand each category and set the levels below. The names match the ConnectWise Security Roles screen. Leave every permission that is not listed, and every category not listed (such as Marketing), at None.Use All, not My: My limits the API member to records assigned to it, so syncs miss records and updates to other people’s work fail. A row marked only when is needed only if you use that feature; the rest of the integration works without it.
Companies
Permission
Add
Edit
Delete
Inquire
Used for
Company Maintenance
None
All
None
All
Sync companies and their sites. Edit is needed only when traffic light writes company custom fields.
Contacts
All
All
None
All
Sync contacts for user import. Add creates a contact, or adds a phone number, when a company user without a ConnectWise contact submits a ticket; Edit updates the phone number from the ticket form.
Configurations
None
All
None
All
Sync configurations as devices. Edit is needed only when warranty writeback is on.
Team Members
None
None
None
All
Read each company’s account team
Manage Attachments
All
None
None
All
Upload ticket attachments and read quote documents
Notes
All
All
All
All
Only when traffic light writes a banner note to the company: add, update and remove it
CRM/Sales Activities
All
None
None
All
Only when CSAT follow-up creates an activity for a low score
Finance
Permission
Add
Edit
Delete
Inquire
Used for
Agreements
None
None
None
All
Sync agreements and additions for contract value and prepaid hours
Invoicing
None
None
None
All
Sync invoices and open invoice PDFs
Billing View Time
None
All
None
All
Read billable time. Edit is needed only when staff log billable time from MSPortal.
Procurement
Permission
Add
Edit
Delete
Inquire
Used for
Product Catalog
None
None
None
All
Sync the product catalog
Project
Project sync needs only Inquire on Project Headers and Project Tickets. The other levels are for creating and updating ConnectWise projects from MSPortal; see Project management permissions.
Permission
Add
Edit
Delete
Inquire
Used for
Project Headers
All
All
None
All
Sync projects; create projects and update their status, name, dates and custom fields
Project Phase
All
All
None
All
Read phases; create phases and update their names and dates
Project Tickets
All
All
None
All
Sync project tickets; create them and update status, owner, priority, dates, budget hours and custom fields
Close Projects
None
All
None
All
Move a project into a closed status
Close Project Tickets
None
All
None
All
Move a project ticket into a closed status
Project Notes
All
None
None
All
Read and add project ticket notes
Project Teams
All
All
All
All
Read project teams; add, change and remove people in a project role
Project Ticket Tasks
All
All
All
All
Read and add checklist items and change their completion. Delete is needed only forDelete checklist item.
Project Templates
None
None
None
All
Import project templates
Sales
Permission
Add
Edit
Delete
Inquire
Used for
Opportunity
All
None
None
All
Sync opportunities. Add creates an opportunity from a Planner item.
Closed Opportunity
None
None
None
All
Sync won and lost opportunities
Opportunity Finance
None
None
None
All
Read forecast lines for opportunity and quote values
Service Desk
Permission
Add
Edit
Delete
Inquire
Used for
Service Tickets
All
All
None
All
Sync tickets and notes; create tickets, add notes, change status and write ticket custom fields
Close Service Tickets
None
All
None
All
Move a ticket into a closed status from the portal or a change approval
Resource Scheduling
All
All
All
All
Only when you book work from Projects > Dispatch: create, move and remove schedule entries
System
Permission
Add
Edit
Delete
Inquire
Used for
Member Maintenance
None
None
None
All
Match ConnectWise members to staff, ticket owners and time entry authors
Table Setup
All
All
None
All
Read boards, statuses, types, sources, priorities, work types, work roles, project roles and custom field definitions. Add and Edit create and update the ticket callback that keeps tickets current in real time.
Time & Expense
Permission
Add
Edit
Delete
Inquire
Used for
Time Entry
All
None
None
All
Sync time for hours and effort reporting. Add logs time on tickets and project tickets.
Time Entry Billable Option
None
All
None
All
Only when staff choose billable or non-billable when logging time
If Table Setup is customized to specific tables, allow at least General / Integrator Login for the ticket callback and Service / Service Board for boards.
Click Save and Close to finalize the security role settings.
Create API Member
1
Navigate to API Members
Go to System > Members
Click the API Members tab
Click + to create a new API member
2
Configure API Member
Name it “MSPortal”
Select the MSPortal security role you created
Enter your Business Unit and Location
Click Save
3
Generate API Keys
With the API member open, click the API Keys tab
Click + to add a new key
Name it “MSPortal” and click Save
Important: Copy the Public Key and Private Key immediately
The API keys cannot be retrieved again after closing this dialog. Make sure to save them securely before proceeding.
Project management permissions
Skip this section unless you will create or update ConnectWise projects from MSPortal. The Project permissions in the role above already include these levels; use this section to check an existing role.The settings go on the role of the API member that owns the keys saved in MSPortal. Your staff member’s personal ConnectWise role does not give the integration any access.
1
Open the API member's role
In ConnectWise, go to System > Members > API Members, open the MSPortal API member and note its security role. Then open that role under System > Security Roles.
2
Set the Project permissions
Expand Project and set the levels below. Use All, not My, because My can stop the integration from updating work assigned to someone else.
Project permission
Required levels
Used for
Project Headers
Inquire: All; Add: All; Edit: All
Sync projects, create PSA projects, and update project status, dates and mapped fields
Project Phase
Inquire: All; Add: All; Edit: All
Read phases, create phases when launching or applying a template, and update phase names and dates
Project Tickets
Inquire: All; Add: All; Edit: All
Read and create project tickets, and update their status, owner, priority, summary, budget hours, dates and mapped fields
Close Projects
Inquire: All; Add: None; Edit: All
Move a project into a closed status
Close Project Tickets
Inquire: All; Add: None; Edit: All
Move a project ticket into a closed status
Project Notes
Inquire: All; Add: All
Read and add project ticket notes. Project ticket comments also need access to the parent Project Tickets record.
Project Teams
Inquire: All; Add: All; Edit: All; Delete: All
Read project team members and fill assignment choices; add, change and remove people in a project role
Project Ticket Tasks
Inquire: All; Add: All; Edit: All
Read and add checklist items, change completion and update checklist progress notes. This is separate from Project Tickets.
Project Templates
Inquire: All
Import project templates into Settings > Projects > Templates
Project ticket status changes need Project Tickets > Edit Level: All. Project Ticket Tasks Edit only covers checklist changes.
3
Set the supporting permissions
Project management also uses records outside the Project module. Keep the required company, contact, member and lookup permissions, and set these for the features you use:
Area
Access
Used for
Companies > Company Maintenance and Contacts
Inquire: All
Select the project’s company and contact
System > Member Maintenance
Inquire: All
Resolve project managers, ticket owners and time entry authors
System > Table Setup
Inquire: All
Fill boards, statuses, types, priorities, work types, work roles and project roles. A missing lookup can block a write even when the project is editable.
Time & Expense > Time Entry
Inquire: All; Add: All when logging time
Sync project effort and create project ticket time entries
Finance > Billing View Time
Inquire: All; Edit: All when logging billable time
Read and record billable time
Time & Expense > Time Entry Billable Option
Inquire and Edit: All when choosing billable or non-billable time
Set the billing option on time entries
Finance > Agreements
Inquire: All when using agreement time settings
Resolve agreement references for time entry
These permissions do not override ConnectWise validation, board restrictions, closed record rules or required fields.
4
Decide on checklist deletion
Read, create and update work does not need Delete access, except removing someone from a project role, which needs Project Teams > Delete Level: All. To use Delete checklist item, also set Project > Project Ticket Tasks > Delete Level: All. Leave Delete off on other project records.
5
Save and re-check
Save the role. In MSPortal, open the ConnectWise Manage connection from Settings > Integrations, select Permissions and click Re-check.
MSPortal-only projects, portal templates and project registers use MSPortal permissions only. An explicit action that creates or updates a PSA project, phase or ticket needs the ConnectWise permissions above. ConnectWise access never grants a staff or client user access inside MSPortal.
What MSPortal writes back to ConnectWise projects
ConnectWise projects are two-way for status and dates. You do not need to repeat these changes in ConnectWise:
Project status, from the portfolio Kanban or the project’s status.
Project ticket status, from the project Board or ticket details.
Ticket owner, from the Resources board or the project Board.
Project, phase and ticket dates, from Reschedule, Edit dates, Projects > Dispatch, or ticket and phase details.
MSPortal writes to ConnectWise first and updates its own copy only after ConnectWise accepts the change. If ConnectWise rejects it, MSPortal shows an error and keeps the old value.Phase descriptions and notes, milestones, and project and onboarding templates stay in MSPortal. Onboarding task status syncs with ConnectWise, and an onboarding task due date changed in the portal is written to the linked ConnectWise ticket. Onboarding phase dates stay in MSPortal. See What writes back to your PSA.
Allow project checklist changes
Adding a checklist item or changing its completion writes to ConnectWise as the API member. The staff member needs the MSPortal project permission, and the API member separately needs ConnectWise access.
1
Find the API member
In ConnectWise, open System > Members > API Members and find the member that owns the public key saved in MSPortal.
2
Open its security role
Note the member’s security role, then open it under System > Security Roles.
3
Set Project Ticket Tasks
Expand Project and set Project Ticket Tasks:
Level
Setting
Purpose
Inquire Level
All
Read checklist items
Add Level
All
Add checklist items
Edit Level
All
Update checklist completion
Keep the role dedicated to MSPortal. If another integration shares it, check the effect on that integration first.
4
Re-check in MSPortal
Save the role, then open the ConnectWise Manage connection from Settings > Integrations, select Permissions and click Re-check. Read the Project checklist writes result:
Result
Meaning
Granted
All three task permission levels are All
Not permitted
The role denies at least one of the three levels
Could not verify
MSPortal could not read the role, or a level is set to My. Review the role in ConnectWise. This result does not prove the action is denied.
Projects and Project checklist writes are separate checks. With Project Ticket Tasks at Inquire All and Add/Edit None, staff can view checklists but cannot add items or change completion. Project sync keeps running while you fix the write permissions.
Part 2: Connect ConnectWise Manage in MSPortal
The ConnectWise Manage connection page lists its tasks in the Setup guide: Connect, Permissions, Choose data, Import or match companies, Import or match users, Import devices, Configure tickets, Configure opportunities and Review. Most tasks save each change as you make it, so you can leave and come back to any task later.
Connect
1
Open the connection page
In MSPortal.ai, go to Settings > Integrations. On the Directory tab, find ConnectWise Manage and click Connect. To continue an existing connection, open it from your active integrations instead.
Click Test connection and resolve any reported error. A successful test does not save the connection.If the connection fails:
Verify your site address is correct
Check that your Company ID matches exactly
Confirm the API keys are copied correctly
Ensure the API member has the correct security role assigned
4
Save
Click Save and continue to create the connection and move on to Permissions. For an existing connection, leave masked credentials unchanged to keep them, or enter replacements, test them and click Save changes.
Permissions
MSPortal checks which parts of ConnectWise your API member is allowed to read, and shows the result for each area of data. An existing Connected indicator is not proof of a fresh test.
1
Review the results
If the check has not run yet, click Run check. Each area of data is listed as granted, not permitted or could not verify.Areas under Required must be granted before you can continue: Companies, Contacts and staff, Tickets, and Boards and statuses. Without these the integration cannot function.Areas under Recommended cover Configurations, Opportunities, Product catalog, Invoices, Agreements, Projects, Project checklist writes, and Time entries.Importing project templates from ConnectWise into Settings > Projects > Templates also needs Project > Project Templates with Inquire Level: All. If the import dialog reports that ConnectWise refused the request, add that permission to the MSPortal security role and try again.
2
Grant anything missing
Any area that is not permitted shows the exact ConnectWise security role setting to change, for example Procurement -> Product Catalog (Inquire Level: All).Update the MSPortal security role in System > Security Roles, then come back and click Re-check.
Could not verify usually means ConnectWise was slow or unavailable, not that a permission is missing. Click Re-check before you change the role.
3
Reduce excess access
The check also reads the API member’s own security role and compares it with the MSPortal role in Create Security Role. If the role grants more, Permissions shows The ConnectWise Manage API user has more access than MSPortal needs and lists each permission set above that role, with the levels it grants and what MSPortal needs. For example, Companies -> Company Maintenance: Delete All. MSPortal needs Edit All, Inquire All. Any level on a permission the table does not list counts, including Inquire.MSPortal keeps working, but anyone who obtains the API keys gets the extra access. Go to System > Members > API Members, open the member that owns MSPortal’s API keys and note its security role. Lower each listed permission to what MSPortal needs under System > Security Roles. If the role is shared with people or other integrations, give the API member its own MSPortal role instead. Then click Re-check.The warning never blocks setup or turns off a sync.
4
Continue
You can continue with recommended areas ungranted. Those syncs stay switched off and their toggles are locked in Choose data until you grant the permission and re-check. Project checklist writes never turns off project sync.
If a permission is removed later, MSPortal switches off the affected sync and notifies your integration admins rather than retrying against an endpoint it can no longer read.
Choose data
Choose data lays its switches side by side in two groups, Core data and Extended data. Turning a dataset on reveals its settings below that group; turning it off hides them without clearing saved choices. Each switch and selector has an (i) beside its name: hover over, tap or focus it to read what the setting does. Each switch and selector saves when you change it. Wait for the saved state, and start the first sync when it is offered.
Option
Description
Sync Companies
Sync company data from ConnectWise. Its company filters and company auto-import settings appear below the Core data row.
Sync Users
Sync member and contact data from ConnectWise. Its contact auto-import settings appear below the Core data row.
Enable Opportunity Sync
Sync opportunities from ConnectWise. Its Auto-import to Planner switch appears below the Extended data switches.
Enable Project Sync
Sync projects from ConnectWise
Enable Invoice Sync
Sync invoices from ConnectWise. Hide invoice statuses appears below the Extended data switches.
Sync product catalog
Import the product and service catalog for quoting and budgets
Enable change management
Import ConnectWise changes into the change calendar
Warranty writeback
Write warranty data back to ConnectWise configurations when MSPortal resolves a device’s warranty
Enable Ticket Sync
Sync service tickets from ConnectWise. It sits in the Core data row, and its ticket scope appears below that row.
A toggle appears locked when the permission check found that your API member cannot read that data. Grant the permission named beside it in ConnectWise, then click Re-check on Permissions to unlock it.
Company & Data Sync Filters (under Sync Companies):
Setting
Description
Skip Inactive Companies
Only sync active companies (recommended)
Auto Import Locations
Import synced sites as locations during each sync
Exclude Company Types
Select company types to exclude from sync
Exclude Company Statuses
Select company statuses to exclude from sync
Exclude Opportunity Types
Select opportunity types to exclude from sync
Exclude Project Types
Select project types to exclude from sync
Company Auto-Import: under Auto-Import Company Types, select the company types to create in the portal automatically during sync. MSPortal asks you to confirm before it imports a new batch, because companies are a billed item.Contact Auto-Import: turn on Contact Auto-Import to create user accounts for active contacts automatically when companies are added. Select a Default Role for Imported Contacts, and optionally use Add rule under Portal roles by contact type to give specific ConnectWise contact types other portal roles. Unmapped types use the default role.
We recommend choosing a role with minimal permissions if you plan to import all contacts.
Catchall contacts never sign in: ConnectWise files email from senders it cannot match under its built-in Catchall company. Those contacts can belong to any of your clients, so MSPortal ignores them: it never imports them as users, never links them to an existing user, and never lets anyone sign in to a user in the Catchall company. To give such a person access, move their contact to the right company in ConnectWise. After the next sync they import like any other contact, and a sign-in they already had moves to their new user automatically.To create portal users from your clients’ Microsoft 365 tenants instead, use an access rule with the action Import Microsoft 365 users (branch preview). See Set access rules.Planner auto-import: with Enable Opportunity Sync on, turn on Auto-import to Planner to create a planner item for each new ConnectWise opportunity. Use Minimum opportunity value and Opportunity types to auto-import to limit which ones come through. See Importing PSA Opportunities.Invoice visibility: with Enable Invoice Sync on, use Hide invoice statuses to choose the invoice statuses to hide from the Invoices page. Hiding a status does not stop those invoices from syncing.Ticket Sync Scope: with Enable Ticket Sync on, select the Boards to Sync and the statuses to exclude.Ticket Notes: company users see a ticket’s Discussion notes. Turn on Show resolution notes to company users to also show notes from the ConnectWise Resolution stream, for example when your technicians record the fix as a Resolution note. Internal Analysis notes are never shown to company users. The switch is off by default.
The first sync runs in the background and can take a few minutes, depending on the amount of data in your ConnectWise instance. Options in later tasks may be incomplete while it runs. Check errors and the connection’s sync result before treating an empty list as final.
Import or match companies
Open Import or match companies. Its first view, Import, includes unlinked records with or without suggestions; Suggested is available for reviewing proposed matches. Use the Import action beside a source company for a single import, or Import companies to open the selection dialog. The dialog loads unmatched records across provider pages for the current search. Use Select current page for its displayed page or Select all pages for every matching record. Review the names and selected count, then confirm the import. Existing portal companies with the same name are matched instead of duplicated.To link a company that already exists under a different name, choose it in the row, or review a suggested match and accept it. Review N suggested matches opens Accept suggested matches, which lists every suggestion at 70% confidence or more with those at 90% or more already selected. Lower the Auto-select by confidence slider, as far as 70%, to select weaker suggestions too, untick any pair you want to check yourself, then select Apply N Matches. Accepted matches, removed matches and ignores save when applied; opening the import dialog alone saves nothing.
Import or match users
Import or match at least one company, then open Import or match users for its contacts. You can leave other companies for later and return to import more users. The workspace opens on Import, which includes suggested contacts too.
Use Import beside a contact, or select contacts and choose Import selected.
Use the header checkbox to select the current page, click it again to select all pages matching the current filters, and click again to clear the selection. Use row checkboxes for individual contacts.
Select all with email replaces the selection with contacts that have an email address across all pages matching the current filters.
In the review panel, choose the Role and review the ready-to-import and skipped counts. Contacts without an email address are skipped; you can add an address before confirming. Correct invalid addresses or clear them to skip those contacts, and resolve duplicate addresses. Large selections are imported in batches.
To link an existing account, choose that user or accept a reviewed suggestion. Importing contacts does not invite them to the portal. See Import companies and Import users for selection scope and retry guidance.
Import devices
Import devices shows ConnectWise configurations. Match each ConnectWise configuration type to an MSPortal device type, turn on Auto-import for types you want imported on every sync, then import the staged configurations. Confirm the company and device type before importing, then check the result in Devices. See Import Devices for the full guide.
Configure tickets
Configure tickets sets ticket behavior inside MSPortal. Changes save as you make them. Wait for the saved state and resolve any reported save failure before you leave.
1
Review new ticket defaults
New ticket defaults sets the board and other PSA values used for new tickets created in the portal. These are the same defaults as Settings > Tickets, and editing them requires the Ticket Settings permission. It includes the Requester field, which records each submitter’s name in a ticket UDF. See Requester field.
2
Check which statuses count as closed
A ticket counts as closed when its ConnectWise status is marked Closed Status, or when the status’s SLA setting is Resolved. Statuses such as Completed usually stop the SLA clock before a later close, so their tickets leave the open ticket lists right away.If a board uses Resolved for a status that still means work is under way, such as Re-Opened, add it to Resolved statuses that stay open. Each name applies to every board you selected in Choose data, and a status marked Closed in ConnectWise always counts as closed.
3
Place statuses in resolution stages
The resolution stages drive the ticket progress indicator. Place each ConnectWise status in the stage it belongs to. A status can sit in one stage only.
Stage
Description
New
Tickets that are newly created or not yet triaged
Triaged
Tickets that have been reviewed and prioritized
Working
Tickets actively being worked on
Waiting
Tickets waiting for customer response or approval
Resolved
Tickets that are completed or closed
4
Set the reply mailbox (optional)
Emailing ticket notes is off until you turn it on in Settings > Tickets > General > Email ticket notes. To let staff and company users email a ticket note on this connection, also set Reply mailbox under Emailing contacts from notes. Enter the mailbox ConnectWise reads incoming email from. MSPortal sends the note from your sending domain with this mailbox as the reply address and the ticket number in the subject, so a reply is added to the ticket. Without it, the Email to field is not offered on this connection’s tickets.
5
Sync tickets
Action
Description
Sync tickets now
Trigger an immediate sync of ticket data
Clear & Resync
Delete this integration’s synced tickets in MSPortal and perform a fresh sync (useful after major configuration changes). Tickets in ConnectWise are not affected.
Use Re-sync PSA Settings when newly created ConnectWise boards or statuses are missing.
Configure opportunities
Configure opportunities sets defaults for opportunities created from MSPortal and how synced opportunities update linked Planner items. Whether opportunities sync is chosen in Choose data.
Setting
Description
Default Stage
The starting stage for new opportunities
Default Type
The default opportunity type
Fallback Sales Rep
Sales rep assigned when the user doesn’t have a linked ConnectWise member
Linked planner item refresh
Which planner fields are refreshed when a linked opportunity syncs, plus status and type mappings
Review and finish setup
Open Review and resolve any required incomplete tasks before selecting Finish setup. Each task saves its own changes; finishing setup does not apply a separate batch of pending company or user imports. Imports and syncs keep running in the background, so check their results.
Managing Your Integration
Open the connection from Settings > Integrations to manage it:
Overview and Sync activity show the connection’s health, matches and the outcome of each sync run.
Run sync in the connection header starts a sync for all data or for one dataset, such as tickets or PSA reference data.
Any setup task can be reopened from the Setup guide to change its settings.
On the ConnectWise Manage row in Settings > Integrations, the row’s More actions menu also offers:
Sync PSA data: Refresh configuration data (priorities, boards, statuses, types) from ConnectWise. See Re-sync PSA Settings.
Import configurations: Open the Import devices task, where you map ConnectWise configuration types to MSPortal device types, turn on auto-import, and ignore records you don’t need. See Import Devices.
To remove the integration, open More actions in the connection header and choose Disconnect…. Review the confirmation: disconnecting removes the stored credentials, company matches and data synced from this connection, and cannot be undone. Disconnecting does not revoke the API keys in ConnectWise; delete them there separately.
Devices from ConnectWise configurations
MSPortal treats an RMM, MDM or network tool as the source of truth for a device. When an RMM is connected, a ConnectWise configuration keeps or creates a device only when its type has Auto-import on and is not ignored in Import Devices. Configurations of other types add their details to devices your RMM reports.
Configurations removed in ConnectWise. Once a day MSPortal checks the full list of active configurations in ConnectWise. A configuration that is deleted or made inactive is removed from staging three days after ConnectWise stops listing it, and stays if it comes back in the meantime.
What happens to the device. When the configuration leaves staging, its device moves to another integration that still reports it, such as your RMM. A device nothing else reports is removed. In a tenant with an RMM, an IT Glue or other PSA record keeps the device only when its type has Auto-import on.
Only companies still mapped to this connection are affected. Unmapping a company or excluding a type stops syncing those records and keeps their devices. Archived devices are never removed.
Troubleshooting
Issue
Solution
Connection test fails
Verify the site address (no https://), Company ID, and API keys are correct
A data option is locked or unavailable
Check the Permissions result for that area, grant the permission in ConnectWise and click Re-check
Missing companies after sync
Check if company types or statuses are excluded in Choose data, the sync result and company matches
Permission errors
Verify the API member has the MSPortal security role assigned
Sync not starting
Check the connection status. A paused connection must be reactivated before Run sync works.
Tickets from wrong boards
Verify the correct boards are selected in Ticket Sync Scope
Contacts not importing
Verify Contact Auto-Import is on and a default role is selected in Choose data
New boards or statuses are missing
Run Sync PSA data, then check the boards selected in Choose data
Setup finished but records are absent
Check pending imports, background errors in Sync activity and the selected company
Changing a project ticket status fails with a security error
Check Project Tickets > Edit Level on the API member’s role. Project Ticket Tasks Edit is a different permission.
Only closing a project or ticket fails
Check Close Projects or Close Project Tickets Edit access and ConnectWise’s required closure fields
Creating a project or applying a template fails
Check Add access to Project Headers, Project Phase and Project Tickets, plus lookup access. Check records already created before retrying.
Checklist deletion is unavailable
Check Project Ticket Tasks > Delete Level: All and whether MSPortal can verify the API member’s role
Adding a checklist item fails with a security error
Check Project Ticket Tasks > Add Level on the API member’s role. A successful project read check does not verify creation access.
Checklist completion changes fail
Check Project Ticket Tasks > Edit Level on the same role
Checklist permissions could not be verified
Review the API member’s role in ConnectWise. Restricted access to security settings, My levels or a temporary API failure can block the check.
Frequently asked questions
Does Test connection save the connection?
No. Select Save and continue after a successful test to create a connection, or Save changes to save replacement credentials on an existing connection.
Does a green permissions result verify ticket writes?
Not every write. Sync checks probe read access, while Project checklist writes reads the API member’s task permission levels without changing data. Creating tickets, comments or other ConnectWise changes still needs the relevant write permission and a successful action.
Does MSPortal write back to ConnectWise, or is it one way?
It writes back. Project status, ticket status, ticket owners, and project, phase and ticket dates you change in MSPortal are written to ConnectWise, so you do not update them again there. Milestones and onboarding portal dates stay in MSPortal. See What MSPortal writes back to ConnectWise projects.
Does Finish setup mean all data is ready?
No. Check the background sync result and verify company, user and device imports separately.
Will every discovered contact receive portal access?
No. Discovery and import are separate. Review user matches, company links and the permissions assigned to portal users; invitation is a separate workflow.
Can I replace saved credentials by retesting the form?
A retest only verifies access. Select Save changes after testing the replacement credentials, then confirm the saved connection before revoking the old keys in ConnectWise.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"MSPortal.ai Documentation","colors":{"primary":"#0C8376","light":"#15B79E","dark":"#107569"},"logo":{"light":"https://mintcdn.com/msportal/KnbwIXtZSTlVJTt6/logo/light.svg?fit=max\u0026auto=format\u0026n=KnbwIXtZSTlVJTt6\u0026q=85\u0026s=eb69f6d6bf16b2c401770aef19ade1d2","dark":"https://mintcdn.com/msportal/KnbwIXtZSTlVJTt6/logo/dark.svg?fit=max\u0026auto=format\u0026n=KnbwIXtZSTlVJTt6\u0026q=85\u0026s=03f8df7191e7a8ea7da084df57f6107f"},"favicon":"https://mintcdn.com/msportal/KjsKytvp08K0bejm/favicon-16x16.png?fit=max\u0026auto=format\u0026n=KjsKytvp08K0bejm\u0026q=85\u0026s=378df7f039bbff7885231fec799d29ac","navbar":{"links":[{"href":"/release-notes/roadmap","label":"Roadmap"},{"href":"mailto:support@msportal.ai","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.msportal.ai"}},"footer":{"socials":{"linkedin":"https://linkedin.com/company/msportal"},"links":[{"header":"Resources","items":[{"label":"MSPortal.ai","href":"https://msportal.ai"},{"label":"Support","href":"mailto:support@msportal.ai"},{"label":"Status","href":"https://status.msportal.ai"}]}]},"fonts":{"family":"Inter"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"msportal","hasAudioNarration":false,"actualSubdomain":"msportal","customDomains":["docs.msportal.ai"],"gitSource":{"type":"github","owner":"msportal-ai","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6af75ae5643517979ab0f116","clientVersion":"0.0.4131","searchFilterCounts":[{"language":"default","tag":"MSP Guides","count":470},{"language":"default","tag":"API Reference","count":433},{"language":"default","tag":"Operations","count":126},{"language":"default","tag":"Planning","count":101},{"language":"default","tag":"Integrations","count":95},{"language":"default","tag":"Projects","count":75},{"language":"default","tag":"Protection","count":59},{"language":"default","tag":"Standards","count":56},{"language":"default","tag":"Client Onboarding","count":48},{"language":"default","tag":"Compliance","count":45}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#page-title{font-size:1.75rem;line-height:2.125rem}#header .prose.text-lg{font-size:1rem;line-height:1.5rem;color:rgb(var(--gray-500))}#content-area .prose{font-size:0.9375rem;line-height:1.6}#content-area .mdx-content{margin-top:1.5rem}#content-area .mdx-content h2{font-size:1.25rem;line-height:1.75rem;margin-top:2.25rem;margin-bottom:0.75rem}#content-area .mdx-content h3{font-size:1.0625rem;line-height:1.5rem;margin-top:1.75rem;margin-bottom:0.5rem}#content-area .mdx-content li{margin-top:0.25em;margin-bottom:0.25em}#content-area .steps{margin-top:1rem}#content-area .step{padding-bottom:0.75rem}#content-area [data-component-part=\"step-title\"]{margin-top:0.25rem;margin-bottom:0.375rem}#content-area [data-component-part=\"accordion-content\"] td,#content-area [data-component-part=\"accordion-content\"] th{min-width:0}@media (max-width: 639px){#content-area [data-component-part=\"accordion-content\"] td:last-child{min-width:16rem}}#content-area [data-table-wrapper]>[data-component-part=\"scroll-area-viewport\"]{-webkit-mask-image:linear-gradient(\n to right,\n transparent 0,\n black min(var(--scroll-area-fade-size), var(--scroll-area-overflow-x-start, 0px)),\n black calc(100% - min(var(--scroll-area-fade-size), var(--scroll-area-overflow-x-end, 0px))),\n transparent 100%\n );mask-image:linear-gradient(\n to right,\n transparent 0,\n black min(var(--scroll-area-fade-size), var(--scroll-area-overflow-x-start, 0px)),\n black calc(100% - min(var(--scroll-area-fade-size), var(--scroll-area-overflow-x-end, 0px))),\n transparent 100%\n )}#content-area [data-table-wrapper]>[data-component-part=\"scroll-area-scrollbar\"][data-has-overflow-x]{opacity:1;pointer-events:auto}#sidebar-content li>a,#sidebar-content li>button{font-size:0.875rem;line-height:1.25rem;padding-top:0.3125rem;padding-bottom:0.3125rem}#sidebar-content li>a span{hyphens:manual}#sidebar-content a.nav-anchor{margin-bottom:0.25rem;font-size:0.875rem}#sidebar-content ul:has(>li>a.nav-anchor){margin-bottom:1rem;padding-bottom:0.5rem;border-bottom:1px solid rgb(var(--gray-100))}.dark #sidebar-content ul:has(>li>a.nav-anchor){border-bottom-color:rgb(255 255 255 / 0.1)}#table-of-contents{font-size:0.8125rem;line-height:1.25rem}#sidebar-content li>a>div:first-child:has(>svg,>img){display:none}:root{--sidebar-width: 16rem}@media (min-width: 1024px){#navbar .max-w-8xl,#body-content{max-width:none}#content-container{max-width:88rem;margin-left:0;padding-left:2.5rem;padding-right:2rem;column-gap:2.5rem;justify-content:space-between}}@media (min-width: 1280px){#content-area{width:calc(100% - 16.5rem);max-width:52rem;margin-left:0}#navbar.is-wide~#body-content #content-container{max-width:none}#navbar.is-wide~#body-content #content-area{width:100%;max-width:none}#table-of-contents-layout{width:14rem;padding-left:0}#table-of-contents{width:14rem}}.roadmap-embed{display:block;border:0;background:transparent;color-scheme:light}.dark .roadmap-embed{color-scheme:dark}#content-area img[width=\"390\"],#content-area img[width=\"780\"]{width:100%!important;max-width:300px!important;height:auto!important;margin-left:auto;margin-right:auto}"}],"page":{"pagePath":"user-guides/integrations/enable-connectwise-integration","slug":"/user-guides/integrations/enable-connectwise-integration","pageMetadata":{"title":"Configure ConnectWise Manage Integration","description":"Connect your ConnectWise Manage instance to MSPortal.ai and choose what it syncs","icon":"plug","href":"/user-guides/integrations/enable-connectwise-integration"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Connect your ConnectWise Manage instance to MSPortal.ai and choose what it syncs\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,hr:`hr`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Heading,Info,Note,Step,Steps,Table,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`This guide walks you through connecting your ConnectWise Manage instance to MSPortal.ai. Connecting an integration is an `,_jsx(_components.strong,{children:`MSP staff`}),` task. Company users do not administer this connection.`]}),`\n`,_jsxs(_components.p,{children:[`You set ConnectWise up first, then work through the tasks on the ConnectWise Manage connection page. See `,_jsx(_components.a,{href:`/user-guides/integrations/index`,children:`Connect and manage integrations`}),` for the tasks every connection shares.`]}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsx(_components.p,{children:`Before you begin, ensure you have:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Admin access to both ConnectWise Manage and MSPortal.ai`}),`\n`,_jsx(_components.li,{children:`Your ConnectWise company ID (visible on the ConnectWise login screen)`}),`\n`,_jsx(_components.li,{children:`Access to create API members and security roles in ConnectWise`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`part-1-configure-connectwise-manage`,children:`Part 1: Configure ConnectWise Manage`}),`\n`,_jsx(_components.p,{children:`Before connecting to MSPortal.ai, you need to create an API member and security role in ConnectWise.`}),`\n`,_jsx(Heading,{level:`3`,id:`create-security-role`,children:`Create Security Role`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Access System Settings`,children:_jsxs(_components.p,{children:[`Login to ConnectWise Manage and navigate to `,_jsx(_components.strong,{children:`System > Security Roles`}),`.`]})}),_jsxs(Step,{title:`Create Security Role`,children:[_jsxs(_components.p,{children:[`Create a security role named “MSPortal”. Expand each category and set the levels below. The names match the ConnectWise `,_jsx(_components.strong,{children:`Security Roles`}),` screen. Leave every permission that is not listed, and every category not listed (such as `,_jsx(_components.strong,{children:`Marketing`}),`), at `,_jsx(_components.strong,{children:`None`}),`.`]}),_jsxs(_components.p,{children:[`Use `,_jsx(_components.strong,{children:`All`}),`, not `,_jsx(_components.strong,{children:`My`}),`: `,_jsx(_components.strong,{children:`My`}),` limits the API member to records assigned to it, so syncs miss records and updates to other people’s work fail. A row marked `,_jsx(_components.em,{children:`only when`}),` is needed only if you use that feature; the rest of the integration works without it.`]}),_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Companies`,id:`companies`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Permission`}),_jsx(_components.th,{children:`Add`}),_jsx(_components.th,{children:`Edit`}),_jsx(_components.th,{children:`Delete`}),_jsx(_components.th,{children:`Inquire`}),_jsx(_components.th,{children:`Used for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Company Maintenance`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsxs(_components.td,{children:[`Sync companies and their sites. Edit is needed `,_jsx(_components.em,{children:`only when`}),` traffic light writes company custom fields.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Contacts`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Sync contacts for user import. Add creates a contact, or adds a phone number, when a company user without a ConnectWise contact submits a ticket; Edit updates the phone number from the ticket form.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Configurations`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsxs(_components.td,{children:[`Sync configurations as devices. Edit is needed `,_jsx(_components.em,{children:`only when`}),` warranty writeback is on.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Team Members`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Read each company’s account team`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Manage Attachments`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Upload ticket attachments and read quote documents`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Notes`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`Only when`}),` traffic light writes a banner note to the company: add, update and remove it`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`CRM/Sales Activities`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`Only when`}),` CSAT follow-up creates an activity for a low score`]})]})]})]})}),_jsx(Accordion,{title:`Finance`,id:`finance`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Permission`}),_jsx(_components.th,{children:`Add`}),_jsx(_components.th,{children:`Edit`}),_jsx(_components.th,{children:`Delete`}),_jsx(_components.th,{children:`Inquire`}),_jsx(_components.th,{children:`Used for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Agreements`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Sync agreements and additions for contract value and prepaid hours`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Invoicing`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Sync invoices and open invoice PDFs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Billing View Time`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsxs(_components.td,{children:[`Read billable time. Edit is needed `,_jsx(_components.em,{children:`only when`}),` staff log billable time from MSPortal.`]})]})]})]})}),_jsx(Accordion,{title:`Procurement`,id:`procurement`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Permission`}),_jsx(_components.th,{children:`Add`}),_jsx(_components.th,{children:`Edit`}),_jsx(_components.th,{children:`Delete`}),_jsx(_components.th,{children:`Inquire`}),_jsx(_components.th,{children:`Used for`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Product Catalog`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Sync the product catalog`})]})})]})}),_jsxs(Accordion,{title:`Project`,id:`project`,children:[_jsxs(_components.p,{children:[`Project sync needs only Inquire on `,_jsx(_components.strong,{children:`Project Headers`}),` and `,_jsx(_components.strong,{children:`Project Tickets`}),`. The other levels are for creating and updating ConnectWise projects from MSPortal; see `,_jsx(_components.a,{href:`#project-management-permissions`,children:`Project management permissions`}),`.`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Permission`}),_jsx(_components.th,{children:`Add`}),_jsx(_components.th,{children:`Edit`}),_jsx(_components.th,{children:`Delete`}),_jsx(_components.th,{children:`Inquire`}),_jsx(_components.th,{children:`Used for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Headers`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Sync projects; create projects and update their status, name, dates and custom fields`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Phase`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Read phases; create phases and update their names and dates`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Tickets`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Sync project tickets; create them and update status, owner, priority, dates, budget hours and custom fields`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Close Projects`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Move a project into a closed status`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Close Project Tickets`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Move a project ticket into a closed status`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Notes`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Read and add project ticket notes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Teams`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Read project teams; add, change and remove people in a project role`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Ticket Tasks`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsxs(_components.td,{children:[`Read and add checklist items and change their completion. Delete is needed `,_jsx(_components.em,{children:`only for`}),` `,_jsx(_components.strong,{children:`Delete checklist item`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Templates`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Import project templates`})]})]})]})]}),_jsx(Accordion,{title:`Sales`,id:`sales`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Permission`}),_jsx(_components.th,{children:`Add`}),_jsx(_components.th,{children:`Edit`}),_jsx(_components.th,{children:`Delete`}),_jsx(_components.th,{children:`Inquire`}),_jsx(_components.th,{children:`Used for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Opportunity`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Sync opportunities. Add creates an opportunity from a Planner item.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Closed Opportunity`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Sync won and lost opportunities`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Opportunity Finance`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Read forecast lines for opportunity and quote values`})]})]})]})}),_jsx(Accordion,{title:`Service Desk`,id:`service-desk`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Permission`}),_jsx(_components.th,{children:`Add`}),_jsx(_components.th,{children:`Edit`}),_jsx(_components.th,{children:`Delete`}),_jsx(_components.th,{children:`Inquire`}),_jsx(_components.th,{children:`Used for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Service Tickets`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Sync tickets and notes; create tickets, add notes, change status and write ticket custom fields`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Close Service Tickets`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Move a ticket into a closed status from the portal or a change approval`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Resource Scheduling`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`Only when`}),` you book work from `,_jsx(_components.strong,{children:`Projects`}),` > `,_jsx(_components.strong,{children:`Dispatch`}),`: create, move and remove schedule entries`]})]})]})]})}),_jsx(Accordion,{title:`System`,id:`system`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Permission`}),_jsx(_components.th,{children:`Add`}),_jsx(_components.th,{children:`Edit`}),_jsx(_components.th,{children:`Delete`}),_jsx(_components.th,{children:`Inquire`}),_jsx(_components.th,{children:`Used for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Member Maintenance`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Match ConnectWise members to staff, ticket owners and time entry authors`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Table Setup`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Read boards, statuses, types, sources, priorities, work types, work roles, project roles and custom field definitions. Add and Edit create and update the ticket callback that keeps tickets current in real time.`})]})]})]})}),_jsx(Accordion,{title:`Time \u0026 Expense`,id:`time-and-expense`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Permission`}),_jsx(_components.th,{children:`Add`}),_jsx(_components.th,{children:`Edit`}),_jsx(_components.th,{children:`Delete`}),_jsx(_components.th,{children:`Inquire`}),_jsx(_components.th,{children:`Used for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Time Entry`})}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`Sync time for hours and effort reporting. Add logs time on tickets and project tickets.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Time Entry Billable Option`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`All`}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`Only when`}),` staff choose billable or non-billable when logging time`]})]})]})]})})]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[`If `,_jsx(_components.strong,{children:`Table Setup`}),` is customized to specific tables, allow at least `,_jsx(_components.strong,{children:`General / Integrator Login`}),` for the ticket callback and `,_jsx(_components.strong,{children:`Service / Service Board`}),` for boards.`]})}),_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Save and Close`}),` to finalize the security role settings.`]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`create-api-member`,children:`Create API Member`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Navigate to API Members`,children:_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Go to `,_jsx(_components.strong,{children:`System > Members`})]}),`\n`,_jsxs(_components.li,{children:[`Click the `,_jsx(_components.strong,{children:`API Members`}),` tab`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`+`}),` to create a new API member`]}),`\n`]})}),_jsx(Step,{title:`Configure API Member`,children:_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Name it “MSPortal”`}),`\n`,_jsxs(_components.li,{children:[`Select the `,_jsx(_components.strong,{children:`MSPortal`}),` security role you created`]}),`\n`,_jsxs(_components.li,{children:[`Enter your `,_jsx(_components.strong,{children:`Business Unit`}),` and `,_jsx(_components.strong,{children:`Location`})]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Save`})]}),`\n`]})}),_jsxs(Step,{title:`Generate API Keys`,children:[_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`With the API member open, click the `,_jsx(_components.strong,{children:`API Keys`}),` tab`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`+`}),` to add a new key`]}),`\n`,_jsxs(_components.li,{children:[`Name it “MSPortal” and click `,_jsx(_components.strong,{children:`Save`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Important:`}),` Copy the `,_jsx(_components.strong,{children:`Public Key`}),` and `,_jsx(_components.strong,{children:`Private Key`}),` immediately`]}),`\n`]}),_jsx(Warning,{children:_jsx(_components.p,{children:`The API keys cannot be retrieved again after closing this dialog. Make sure to save them securely before proceeding.`})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`project-management-permissions`,children:`Project management permissions`}),`\n`,_jsxs(_components.p,{children:[`Skip this section unless you will create or update ConnectWise projects from MSPortal. The `,_jsx(_components.strong,{children:`Project`}),` permissions in the role above already include these levels; use this section to check an existing role.`]}),`\n`,_jsxs(_components.p,{children:[`The settings go on the role of the `,_jsx(_components.strong,{children:`API member that owns the keys saved in MSPortal`}),`. Your staff member’s personal ConnectWise role does not give the integration any access.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open the API member's role`,children:_jsxs(_components.p,{children:[`In ConnectWise, go to `,_jsx(_components.strong,{children:`System > Members > API Members`}),`, open the MSPortal API member and note its security role. Then open that role under `,_jsx(_components.strong,{children:`System > Security Roles`}),`.`]})}),_jsxs(Step,{title:`Set the Project permissions`,children:[_jsxs(_components.p,{children:[`Expand `,_jsx(_components.strong,{children:`Project`}),` and set the levels below. Use `,_jsx(_components.strong,{children:`All`}),`, not `,_jsx(_components.strong,{children:`My`}),`, because `,_jsx(_components.strong,{children:`My`}),` can stop the integration from updating work assigned to someone else.`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Project permission`}),_jsx(_components.th,{children:`Required levels`}),_jsx(_components.th,{children:`Used for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Headers`})}),_jsx(_components.td,{children:`Inquire: All; Add: All; Edit: All`}),_jsx(_components.td,{children:`Sync projects, create PSA projects, and update project status, dates and mapped fields`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Phase`})}),_jsx(_components.td,{children:`Inquire: All; Add: All; Edit: All`}),_jsx(_components.td,{children:`Read phases, create phases when launching or applying a template, and update phase names and dates`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Tickets`})}),_jsx(_components.td,{children:`Inquire: All; Add: All; Edit: All`}),_jsx(_components.td,{children:`Read and create project tickets, and update their status, owner, priority, summary, budget hours, dates and mapped fields`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Close Projects`})}),_jsx(_components.td,{children:`Inquire: All; Add: None; Edit: All`}),_jsx(_components.td,{children:`Move a project into a closed status`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Close Project Tickets`})}),_jsx(_components.td,{children:`Inquire: All; Add: None; Edit: All`}),_jsx(_components.td,{children:`Move a project ticket into a closed status`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Notes`})}),_jsx(_components.td,{children:`Inquire: All; Add: All`}),_jsx(_components.td,{children:`Read and add project ticket notes. Project ticket comments also need access to the parent Project Tickets record.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Teams`})}),_jsx(_components.td,{children:`Inquire: All; Add: All; Edit: All; Delete: All`}),_jsx(_components.td,{children:`Read project team members and fill assignment choices; add, change and remove people in a project role`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Ticket Tasks`})}),_jsx(_components.td,{children:`Inquire: All; Add: All; Edit: All`}),_jsx(_components.td,{children:`Read and add checklist items, change completion and update checklist progress notes. This is separate from Project Tickets.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Project Templates`})}),_jsx(_components.td,{children:`Inquire: All`}),_jsxs(_components.td,{children:[`Import project templates into `,_jsx(_components.strong,{children:`Settings`}),` > `,_jsx(_components.strong,{children:`Projects`}),` > `,_jsx(_components.strong,{children:`Templates`})]})]})]})]}),_jsxs(_components.p,{children:[`Project ticket status changes need `,_jsx(_components.strong,{children:`Project Tickets`}),` > `,_jsx(_components.strong,{children:`Edit Level: All`}),`. `,_jsx(_components.strong,{children:`Project Ticket Tasks`}),` Edit only covers checklist changes.`]})]}),_jsxs(Step,{title:`Set the supporting permissions`,children:[_jsx(_components.p,{children:`Project management also uses records outside the Project module. Keep the required company, contact, member and lookup permissions, and set these for the features you use:`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Area`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Used for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Companies`}),` > `,_jsx(_components.strong,{children:`Company Maintenance`}),` and `,_jsx(_components.strong,{children:`Contacts`})]}),_jsx(_components.td,{children:`Inquire: All`}),_jsx(_components.td,{children:`Select the project’s company and contact`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`System`}),` > `,_jsx(_components.strong,{children:`Member Maintenance`})]}),_jsx(_components.td,{children:`Inquire: All`}),_jsx(_components.td,{children:`Resolve project managers, ticket owners and time entry authors`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`System`}),` > `,_jsx(_components.strong,{children:`Table Setup`})]}),_jsx(_components.td,{children:`Inquire: All`}),_jsx(_components.td,{children:`Fill boards, statuses, types, priorities, work types, work roles and project roles. A missing lookup can block a write even when the project is editable.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Time \u0026 Expense`}),` > `,_jsx(_components.strong,{children:`Time Entry`})]}),_jsx(_components.td,{children:`Inquire: All; Add: All when logging time`}),_jsx(_components.td,{children:`Sync project effort and create project ticket time entries`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Finance`}),` > `,_jsx(_components.strong,{children:`Billing View Time`})]}),_jsx(_components.td,{children:`Inquire: All; Edit: All when logging billable time`}),_jsx(_components.td,{children:`Read and record billable time`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Time \u0026 Expense`}),` > `,_jsx(_components.strong,{children:`Time Entry Billable Option`})]}),_jsx(_components.td,{children:`Inquire and Edit: All when choosing billable or non-billable time`}),_jsx(_components.td,{children:`Set the billing option on time entries`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Finance`}),` > `,_jsx(_components.strong,{children:`Agreements`})]}),_jsx(_components.td,{children:`Inquire: All when using agreement time settings`}),_jsx(_components.td,{children:`Resolve agreement references for time entry`})]})]})]}),_jsx(_components.p,{children:`These permissions do not override ConnectWise validation, board restrictions, closed record rules or required fields.`})]}),_jsx(Step,{title:`Decide on checklist deletion`,children:_jsxs(_components.p,{children:[`Read, create and update work does not need Delete access, except removing someone from a project role, which needs `,_jsx(_components.strong,{children:`Project Teams`}),` > `,_jsx(_components.strong,{children:`Delete Level: All`}),`. To use `,_jsx(_components.strong,{children:`Delete checklist item`}),`, also set `,_jsx(_components.strong,{children:`Project`}),` > `,_jsx(_components.strong,{children:`Project Ticket Tasks`}),` > `,_jsx(_components.strong,{children:`Delete Level: All`}),`. Leave Delete off on other project records.`]})}),_jsx(Step,{title:`Save and re-check`,children:_jsxs(_components.p,{children:[`Save the role. In MSPortal, open the ConnectWise Manage connection from `,_jsx(_components.strong,{children:`Settings`}),` > `,_jsx(_components.strong,{children:`Integrations`}),`, select `,_jsx(_components.strong,{children:`Permissions`}),` and click `,_jsx(_components.strong,{children:`Re-check`}),`.`]})})]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`MSPortal-only projects, portal templates and project registers use MSPortal permissions only. An explicit action that creates or updates a PSA project, phase or ticket needs the ConnectWise permissions above. ConnectWise access never grants a staff or client user access inside MSPortal.`})}),`\n`,_jsx(Heading,{level:`3`,id:`what-msportal-writes-back-to-connectwise-projects`,children:`What MSPortal writes back to ConnectWise projects`}),`\n`,_jsx(_components.p,{children:`ConnectWise projects are two-way for status and dates. You do not need to repeat these changes in ConnectWise:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Project status`}),`, from the portfolio `,_jsx(_components.strong,{children:`Kanban`}),` or the project’s status.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Project ticket status`}),`, from the project `,_jsx(_components.strong,{children:`Board`}),` or ticket details.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Ticket owner`}),`, from the `,_jsx(_components.strong,{children:`Resources`}),` board or the project `,_jsx(_components.strong,{children:`Board`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Project, phase and ticket dates`}),`, from `,_jsx(_components.strong,{children:`Reschedule`}),`, `,_jsx(_components.strong,{children:`Edit dates`}),`, `,_jsx(_components.strong,{children:`Projects > Dispatch`}),`, or ticket and phase details.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`MSPortal writes to ConnectWise first and updates its own copy only after ConnectWise accepts the change. If ConnectWise rejects it, MSPortal shows an error and keeps the old value.`}),`\n`,_jsxs(_components.p,{children:[`Phase descriptions and notes, milestones, and project and onboarding templates stay in MSPortal. Onboarding task status syncs with ConnectWise, and an onboarding task due date changed in the portal is written to the linked ConnectWise ticket. Onboarding phase dates stay in MSPortal. See `,_jsx(_components.a,{href:`/user-guides/projects/index#what-writes-back-to-your-psa`,children:`What writes back to your PSA`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`allow-project-checklist-changes`,children:`Allow project checklist changes`}),`\n`,_jsx(_components.p,{children:`Adding a checklist item or changing its completion writes to ConnectWise as the API member. The staff member needs the MSPortal project permission, and the API member separately needs ConnectWise access.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Find the API member`,children:_jsxs(_components.p,{children:[`In ConnectWise, open `,_jsx(_components.strong,{children:`System > Members > API Members`}),` and find the member that owns the public key saved in MSPortal.`]})}),_jsx(Step,{title:`Open its security role`,children:_jsxs(_components.p,{children:[`Note the member’s security role, then open it under `,_jsx(_components.strong,{children:`System > Security Roles`}),`.`]})}),_jsxs(Step,{title:`Set Project Ticket Tasks`,children:[_jsxs(_components.p,{children:[`Expand `,_jsx(_components.strong,{children:`Project`}),` and set `,_jsx(_components.strong,{children:`Project Ticket Tasks`}),`:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Level`}),_jsx(_components.th,{children:`Setting`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Inquire Level`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`All`})}),_jsx(_components.td,{children:`Read checklist items`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Add Level`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`All`})}),_jsx(_components.td,{children:`Add checklist items`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Edit Level`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`All`})}),_jsx(_components.td,{children:`Update checklist completion`})]})]})]}),_jsx(_components.p,{children:`Keep the role dedicated to MSPortal. If another integration shares it, check the effect on that integration first.`})]}),_jsxs(Step,{title:`Re-check in MSPortal`,children:[_jsxs(_components.p,{children:[`Save the role, then open the ConnectWise Manage connection from `,_jsx(_components.strong,{children:`Settings`}),` > `,_jsx(_components.strong,{children:`Integrations`}),`, select `,_jsx(_components.strong,{children:`Permissions`}),` and click `,_jsx(_components.strong,{children:`Re-check`}),`. Read the `,_jsx(_components.strong,{children:`Project checklist writes`}),` result:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Result`}),_jsx(_components.th,{children:`Meaning`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Granted`})}),_jsxs(_components.td,{children:[`All three task permission levels are `,_jsx(_components.strong,{children:`All`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Not permitted`})}),_jsx(_components.td,{children:`The role denies at least one of the three levels`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Could not verify`})}),_jsxs(_components.td,{children:[`MSPortal could not read the role, or a level is set to `,_jsx(_components.strong,{children:`My`}),`. Review the role in ConnectWise. This result does not prove the action is denied.`]})]})]})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Projects`}),` and `,_jsx(_components.strong,{children:`Project checklist writes`}),` are separate checks. With Project Ticket Tasks at Inquire `,_jsx(_components.strong,{children:`All`}),` and Add/Edit `,_jsx(_components.strong,{children:`None`}),`, staff can view checklists but cannot add items or change completion. Project sync keeps running while you fix the write permissions.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`part-2-connect-connectwise-manage-in-msportal`,children:`Part 2: Connect ConnectWise Manage in MSPortal`}),`\n`,_jsxs(_components.p,{children:[`The ConnectWise Manage connection page lists its tasks in the `,_jsx(_components.strong,{children:`Setup guide`}),`: `,_jsx(_components.strong,{children:`Connect`}),`, `,_jsx(_components.strong,{children:`Permissions`}),`, `,_jsx(_components.strong,{children:`Choose data`}),`, `,_jsx(_components.strong,{children:`Import or match companies`}),`, `,_jsx(_components.strong,{children:`Import or match users`}),`, `,_jsx(_components.strong,{children:`Import devices`}),`, `,_jsx(_components.strong,{children:`Configure tickets`}),`, `,_jsx(_components.strong,{children:`Configure opportunities`}),` and `,_jsx(_components.strong,{children:`Review`}),`. Most tasks save each change as you make it, so you can leave and come back to any task later.`]}),`\n`,_jsx(Heading,{level:`3`,id:`connect`,children:`Connect`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open the connection page`,children:_jsxs(_components.p,{children:[`In MSPortal.ai, go to `,_jsx(_components.strong,{children:`Settings`}),` > `,_jsx(_components.strong,{children:`Integrations`}),`. On the `,_jsx(_components.strong,{children:`Directory`}),` tab, find `,_jsx(_components.strong,{children:`ConnectWise Manage`}),` and click `,_jsx(_components.strong,{children:`Connect`}),`. To continue an existing connection, open it from your active integrations instead.`]})}),_jsxs(Step,{title:`Enter your API credentials`,children:[_jsx(_components.p,{children:`Fill in the following fields:`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Description`}),_jsx(_components.th,{children:`Example`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`ConnectWise site`})}),_jsxs(_components.td,{children:[`Your ConnectWise API URL, without `,_jsx(_components.code,{children:`https://`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`na.myconnectwise.net`}),` or `,_jsx(_components.code,{children:`eu.myconnectwise.net`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Company sign-in ID`})}),_jsx(_components.td,{children:`Your company identifier (shown on login screen)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`YourCompanyID`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Public key`})}),_jsx(_components.td,{children:`API public key from the API member`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`abc123...`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Private key`})}),_jsx(_components.td,{children:`API private key from the API member`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`xyz789...`})})]})]})]}),_jsxs(Note,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Site examples:`})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Cloud-hosted: `,_jsx(_components.code,{children:`na.myconnectwise.net`}),`, `,_jsx(_components.code,{children:`aus.myconnectwise.net`}),`, `,_jsx(_components.code,{children:`eu.myconnectwise.net`})]}),`\n`,_jsxs(_components.li,{children:[`On-premise: `,_jsx(_components.code,{children:`cw.yourcompany.com`}),` (without https://)`]}),`\n`]})]})]}),_jsxs(Step,{title:`Test the connection`,children:[_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Test connection`}),` and resolve any reported error. A successful test does not save the connection.`]}),_jsx(_components.p,{children:`If the connection fails:`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Verify your site address is correct`}),`\n`,_jsx(_components.li,{children:`Check that your Company ID matches exactly`}),`\n`,_jsx(_components.li,{children:`Confirm the API keys are copied correctly`}),`\n`,_jsx(_components.li,{children:`Ensure the API member has the correct security role assigned`}),`\n`]})]}),_jsx(Step,{title:`Save`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Save and continue`}),` to create the connection and move on to `,_jsx(_components.strong,{children:`Permissions`}),`. For an existing connection, leave masked credentials unchanged to keep them, or enter replacements, test them and click `,_jsx(_components.strong,{children:`Save changes`}),`.`]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`permissions`,children:`Permissions`}),`\n`,_jsx(_components.p,{children:`MSPortal checks which parts of ConnectWise your API member is allowed to read, and shows the result for each area of data. An existing Connected indicator is not proof of a fresh test.`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Review the results`,children:[_jsxs(_components.p,{children:[`If the check has not run yet, click `,_jsx(_components.strong,{children:`Run check`}),`. Each area of data is listed as granted, not permitted or could not verify.`]}),_jsxs(_components.p,{children:[`Areas under `,_jsx(_components.strong,{children:`Required`}),` must be granted before you can continue: Companies, Contacts and staff, Tickets, and Boards and statuses. Without these the integration cannot function.`]}),_jsxs(_components.p,{children:[`Areas under `,_jsx(_components.strong,{children:`Recommended`}),` cover Configurations, Opportunities, Product catalog, Invoices, Agreements, Projects, Project checklist writes, and Time entries.`]}),_jsxs(_components.p,{children:[`Importing project templates from ConnectWise into `,_jsx(_components.strong,{children:`Settings > Projects > Templates`}),` also needs `,_jsx(_components.strong,{children:`Project > Project Templates`}),` with `,_jsx(_components.strong,{children:`Inquire Level: All`}),`. If the import dialog reports that ConnectWise refused the request, add that permission to the MSPortal security role and try again.`]})]}),_jsxs(Step,{title:`Grant anything missing`,children:[_jsxs(_components.p,{children:[`Any area that is not permitted shows the exact ConnectWise security role setting to change, for example `,_jsx(_components.strong,{children:`Procurement -> Product Catalog (Inquire Level: All)`}),`.`]}),_jsxs(_components.p,{children:[`Update the MSPortal security role in `,_jsx(_components.strong,{children:`System > Security Roles`}),`, then come back and click `,_jsx(_components.strong,{children:`Re-check`}),`.`]}),_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Could not verify`}),` usually means ConnectWise was slow or unavailable, not that a permission is missing. Click `,_jsx(_components.strong,{children:`Re-check`}),` before you change the role.`]})})]}),_jsxs(Step,{title:`Reduce excess access`,children:[_jsxs(_components.p,{children:[`The check also reads the API member’s own security role and compares it with the MSPortal role in `,_jsx(_components.a,{href:`#create-security-role`,children:`Create Security Role`}),`. If the role grants more, `,_jsx(_components.strong,{children:`Permissions`}),` shows `,_jsx(_components.strong,{children:`The ConnectWise Manage API user has more access than MSPortal needs`}),` and lists each permission set above that role, with the levels it grants and what MSPortal needs. For example, `,_jsx(_components.strong,{children:`Companies -> Company Maintenance: Delete All. MSPortal needs Edit All, Inquire All.`}),` Any level on a permission the table does not list counts, including Inquire.`]}),_jsxs(_components.p,{children:[`MSPortal keeps working, but anyone who obtains the API keys gets the extra access. Go to `,_jsx(_components.strong,{children:`System > Members > API Members`}),`, open the member that owns MSPortal’s API keys and note its security role. Lower each listed permission to what MSPortal needs under `,_jsx(_components.strong,{children:`System > Security Roles`}),`. If the role is shared with people or other integrations, give the API member its own MSPortal role instead. Then click `,_jsx(_components.strong,{children:`Re-check`}),`.`]}),_jsx(_components.p,{children:`The warning never blocks setup or turns off a sync.`})]}),_jsx(Step,{title:`Continue`,children:_jsxs(_components.p,{children:[`You can continue with recommended areas ungranted. Those syncs stay switched off and their toggles are locked in `,_jsx(_components.strong,{children:`Choose data`}),` until you grant the permission and re-check. `,_jsx(_components.strong,{children:`Project checklist writes`}),` never turns off project sync.`]})})]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`If a permission is removed later, MSPortal switches off the affected sync and notifies your integration admins rather than retrying against an endpoint it can no longer read.`})}),`\n`,_jsx(Heading,{level:`3`,id:`choose-data`,children:`Choose data`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Choose data`}),` lays its switches side by side in two groups, `,_jsx(_components.strong,{children:`Core data`}),` and `,_jsx(_components.strong,{children:`Extended data`}),`. Turning a dataset on reveals its settings below that group; turning it off hides them without clearing saved choices. Each switch and selector has an (i) beside its name: hover over, tap or focus it to read what the setting does. Each switch and selector saves when you change it. Wait for the saved state, and start the first sync when it is offered.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Option`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Sync Companies`})}),_jsxs(_components.td,{children:[`Sync company data from ConnectWise. Its company filters and company auto-import settings appear below the `,_jsx(_components.strong,{children:`Core data`}),` row.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Sync Users`})}),_jsxs(_components.td,{children:[`Sync member and contact data from ConnectWise. Its contact auto-import settings appear below the `,_jsx(_components.strong,{children:`Core data`}),` row.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Enable Opportunity Sync`})}),_jsxs(_components.td,{children:[`Sync opportunities from ConnectWise. Its `,_jsx(_components.strong,{children:`Auto-import to Planner`}),` switch appears below the `,_jsx(_components.strong,{children:`Extended data`}),` switches.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Enable Project Sync`})}),_jsx(_components.td,{children:`Sync projects from ConnectWise`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Enable Invoice Sync`})}),_jsxs(_components.td,{children:[`Sync invoices from ConnectWise. `,_jsx(_components.strong,{children:`Hide invoice statuses`}),` appears below the `,_jsx(_components.strong,{children:`Extended data`}),` switches.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Sync product catalog`})}),_jsx(_components.td,{children:`Import the product and service catalog for quoting and budgets`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Enable change management`})}),_jsx(_components.td,{children:`Import ConnectWise changes into the change calendar`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Warranty writeback`})}),_jsx(_components.td,{children:`Write warranty data back to ConnectWise configurations when MSPortal resolves a device’s warranty`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Enable Ticket Sync`})}),_jsxs(_components.td,{children:[`Sync service tickets from ConnectWise. It sits in the `,_jsx(_components.strong,{children:`Core data`}),` row, and its ticket scope appears below that row.`]})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`A toggle appears locked when the permission check found that your API member cannot read that data. Grant the permission named beside it in ConnectWise, then click `,_jsx(_components.strong,{children:`Re-check`}),` on `,_jsx(_components.strong,{children:`Permissions`}),` to unlock it.`]})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Company \u0026 Data Sync Filters`}),` (under `,_jsx(_components.strong,{children:`Sync Companies`}),`):`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Setting`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Skip Inactive Companies`})}),_jsx(_components.td,{children:`Only sync active companies (recommended)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Auto Import Locations`})}),_jsx(_components.td,{children:`Import synced sites as locations during each sync`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Exclude Company Types`})}),_jsx(_components.td,{children:`Select company types to exclude from sync`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Exclude Company Statuses`})}),_jsx(_components.td,{children:`Select company statuses to exclude from sync`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Exclude Opportunity Types`})}),_jsx(_components.td,{children:`Select opportunity types to exclude from sync`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Exclude Project Types`})}),_jsx(_components.td,{children:`Select project types to exclude from sync`})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Company Auto-Import:`}),` under `,_jsx(_components.strong,{children:`Auto-Import Company Types`}),`, select the company types to create in the portal automatically during sync. MSPortal asks you to confirm before it imports a new batch, because companies are a billed item.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Contact Auto-Import:`}),` turn on `,_jsx(_components.strong,{children:`Contact Auto-Import`}),` to create user accounts for active contacts automatically when companies are added. Select a `,_jsx(_components.strong,{children:`Default Role for Imported Contacts`}),`, and optionally use `,_jsx(_components.strong,{children:`Add rule`}),` under `,_jsx(_components.strong,{children:`Portal roles by contact type`}),` to give specific ConnectWise contact types other portal roles. Unmapped types use the default role.`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`We recommend choosing a role with minimal permissions if you plan to import all contacts.`})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Catchall contacts never sign in:`}),` ConnectWise files email from senders it cannot match under its built-in `,_jsx(_components.strong,{children:`Catchall`}),` company. Those contacts can belong to any of your clients, so MSPortal ignores them: it never imports them as users, never links them to an existing user, and never lets anyone sign in to a user in the Catchall company. To give such a person access, move their contact to the right company in ConnectWise. After the next sync they import like any other contact, and a sign-in they already had moves to their new user automatically.`]}),`\n`,_jsxs(_components.p,{children:[`To create portal users from your clients’ Microsoft 365 tenants instead, use an access rule with the action `,_jsx(_components.strong,{children:`Import Microsoft 365 users`}),` (branch preview). See `,_jsx(_components.a,{href:`/user-guides/settings/users-roles#set-access-rules`,children:`Set access rules`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Planner auto-import:`}),` with `,_jsx(_components.strong,{children:`Enable Opportunity Sync`}),` on, turn on `,_jsx(_components.strong,{children:`Auto-import to Planner`}),` to create a planner item for each new ConnectWise opportunity. Use `,_jsx(_components.strong,{children:`Minimum opportunity value`}),` and `,_jsx(_components.strong,{children:`Opportunity types to auto-import`}),` to limit which ones come through. See `,_jsx(_components.a,{href:`/user-guides/planner/index#importing-psa-opportunities`,children:`Importing PSA Opportunities`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Invoice visibility:`}),` with `,_jsx(_components.strong,{children:`Enable Invoice Sync`}),` on, use `,_jsx(_components.strong,{children:`Hide invoice statuses`}),` to choose the invoice statuses to hide from the Invoices page. Hiding a status does not stop those invoices from syncing.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Ticket Sync Scope:`}),` with `,_jsx(_components.strong,{children:`Enable Ticket Sync`}),` on, select the `,_jsx(_components.strong,{children:`Boards to Sync`}),` and the statuses to exclude.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Ticket Notes:`}),` company users see a ticket’s Discussion notes. Turn on `,_jsx(_components.strong,{children:`Show resolution notes to company users`}),` to also show notes from the ConnectWise Resolution stream, for example when your technicians record the fix as a Resolution note. Internal Analysis notes are never shown to company users. The switch is off by default.`]}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`The first sync runs in the background and can take a few minutes, depending on the amount of data in your ConnectWise instance. Options in later tasks may be incomplete while it runs. Check errors and the connection’s sync result before treating an empty list as final.`})}),`\n`,_jsx(Heading,{level:`3`,id:`import-or-match-companies`,children:`Import or match companies`}),`\n`,_jsxs(_components.p,{children:[`Open `,_jsx(_components.strong,{children:`Import or match companies`}),`. Its first view, `,_jsx(_components.strong,{children:`Import`}),`, includes unlinked records with or without suggestions; `,_jsx(_components.strong,{children:`Suggested`}),` is available for reviewing proposed matches. Use the `,_jsx(_components.strong,{children:`Import`}),` action beside a source company for a single import, or `,_jsx(_components.strong,{children:`Import companies`}),` to open the selection dialog. The dialog loads unmatched records across provider pages for the current search. Use `,_jsx(_components.strong,{children:`Select current page`}),` for its displayed page or `,_jsx(_components.strong,{children:`Select all pages`}),` for every matching record. Review the names and selected count, then confirm the import. Existing portal companies with the same name are matched instead of duplicated.`]}),`\n`,_jsxs(_components.p,{children:[`To link a company that already exists under a different name, choose it in the row, or review a suggested match and accept it. `,_jsx(_components.strong,{children:`Review N suggested matches`}),` opens `,_jsx(_components.strong,{children:`Accept suggested matches`}),`, which lists every suggestion at 70% confidence or more with those at 90% or more already selected. Lower the `,_jsx(_components.strong,{children:`Auto-select by confidence`}),` slider, as far as 70%, to select weaker suggestions too, untick any pair you want to check yourself, then select `,_jsx(_components.strong,{children:`Apply N Matches`}),`. Accepted matches, removed matches and ignores save when applied; opening the import dialog alone saves nothing.`]}),`\n`,_jsx(Heading,{level:`3`,id:`import-or-match-users`,children:`Import or match users`}),`\n`,_jsxs(_components.p,{children:[`Import or match at least one company, then open `,_jsx(_components.strong,{children:`Import or match users`}),` for its contacts. You can leave other companies for later and return to import more users. The workspace opens on `,_jsx(_components.strong,{children:`Import`}),`, which includes suggested contacts too.`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Use `,_jsx(_components.strong,{children:`Import`}),` beside a contact, or select contacts and choose `,_jsx(_components.strong,{children:`Import selected`}),`.`]}),`\n`,_jsx(_components.li,{children:`Use the header checkbox to select the current page, click it again to select all pages matching the current filters, and click again to clear the selection. Use row checkboxes for individual contacts.`}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Select all with email`}),` replaces the selection with contacts that have an email address across all pages matching the current filters.`]}),`\n`,_jsxs(_components.li,{children:[`In the review panel, choose the `,_jsx(_components.strong,{children:`Role`}),` and review the ready-to-import and skipped counts. Contacts without an email address are skipped; you can add an address before confirming. Correct invalid addresses or clear them to skip those contacts, and resolve duplicate addresses. Large selections are imported in batches.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`To link an existing account, choose that user or accept a reviewed suggestion. Importing contacts does not invite them to the portal. See `,_jsx(_components.a,{href:`/user-guides/integrations/import-companies`,children:`Import companies`}),` and `,_jsx(_components.a,{href:`/user-guides/integrations/import-users`,children:`Import users`}),` for selection scope and retry guidance.`]}),`\n`,_jsx(Heading,{level:`3`,id:`import-devices`,children:`Import devices`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Import devices`}),` shows ConnectWise configurations. Match each ConnectWise configuration type to an MSPortal device type, turn on `,_jsx(_components.strong,{children:`Auto-import`}),` for types you want imported on every sync, then import the staged configurations. Confirm the company and device type before importing, then check the result in Devices. See `,_jsx(_components.a,{href:`/user-guides/integrations/import-devices`,children:`Import Devices`}),` for the full guide.`]}),`\n`,_jsx(Heading,{level:`3`,id:`configure-tickets`,children:`Configure tickets`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Configure tickets`}),` sets ticket behavior inside MSPortal. Changes save as you make them. Wait for the saved state and resolve any reported save failure before you leave.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Review new ticket defaults`,children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`New ticket defaults`}),` sets the board and other PSA values used for new tickets created in the portal. These are the same defaults as `,_jsx(_components.strong,{children:`Settings`}),` > `,_jsx(_components.strong,{children:`Tickets`}),`, and editing them requires the Ticket Settings permission. It includes the `,_jsx(_components.strong,{children:`Requester field`}),`, which records each submitter’s name in a ticket UDF. See `,_jsx(_components.a,{href:`/user-guides/settings/tickets#requester-field`,children:`Requester field`}),`.`]})}),_jsxs(Step,{title:`Check which statuses count as closed`,children:[_jsxs(_components.p,{children:[`A ticket counts as closed when its ConnectWise status is marked `,_jsx(_components.strong,{children:`Closed Status`}),`, or when the status’s SLA setting is `,_jsx(_components.strong,{children:`Resolved`}),`. Statuses such as Completed usually stop the SLA clock before a later close, so their tickets leave the open ticket lists right away.`]}),_jsxs(_components.p,{children:[`If a board uses Resolved for a status that still means work is under way, such as Re-Opened, add it to `,_jsx(_components.strong,{children:`Resolved statuses that stay open`}),`. Each name applies to every board you selected in `,_jsx(_components.strong,{children:`Choose data`}),`, and a status marked Closed in ConnectWise always counts as closed.`]})]}),_jsxs(Step,{title:`Place statuses in resolution stages`,children:[_jsx(_components.p,{children:`The resolution stages drive the ticket progress indicator. Place each ConnectWise status in the stage it belongs to. A status can sit in one stage only.`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Stage`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`New`})}),_jsx(_components.td,{children:`Tickets that are newly created or not yet triaged`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Triaged`})}),_jsx(_components.td,{children:`Tickets that have been reviewed and prioritized`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Working`})}),_jsx(_components.td,{children:`Tickets actively being worked on`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Waiting`})}),_jsx(_components.td,{children:`Tickets waiting for customer response or approval`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Resolved`})}),_jsx(_components.td,{children:`Tickets that are completed or closed`})]})]})]})]}),_jsx(Step,{title:`Set the reply mailbox (optional)`,children:_jsxs(_components.p,{children:[`Emailing ticket notes is off until you turn it on in `,_jsx(_components.strong,{children:`Settings > Tickets > General > Email ticket notes`}),`. To let staff and company users email a ticket note on this connection, also set `,_jsx(_components.strong,{children:`Reply mailbox`}),` under `,_jsx(_components.strong,{children:`Emailing contacts from notes`}),`. Enter the mailbox ConnectWise reads incoming email from. MSPortal sends the note from your sending domain with this mailbox as the reply address and the ticket number in the subject, so a reply is added to the ticket. Without it, the `,_jsx(_components.strong,{children:`Email to`}),` field is not offered on this connection’s tickets.`]})}),_jsxs(Step,{title:`Sync tickets`,children:[_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Sync tickets now`})}),_jsx(_components.td,{children:`Trigger an immediate sync of ticket data`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Clear \u0026 Resync`})}),_jsx(_components.td,{children:`Delete this integration’s synced tickets in MSPortal and perform a fresh sync (useful after major configuration changes). Tickets in ConnectWise are not affected.`})]})]})]}),_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/user-guides/integrations/clear-and-resync-integrations`,children:`Clear and Resync Integrations`}),` before you use `,_jsx(_components.strong,{children:`Clear \u0026 Resync`}),`.`]})]})]}),`\n`,_jsxs(_components.p,{children:[`Use `,_jsx(_components.a,{href:`/user-guides/integrations/connectwise-resync-psa-settings`,children:`Re-sync PSA Settings`}),` when newly created ConnectWise boards or statuses are missing.`]}),`\n`,_jsx(Heading,{level:`3`,id:`configure-opportunities`,children:`Configure opportunities`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Configure opportunities`}),` sets defaults for opportunities created from MSPortal and how synced opportunities update linked Planner items. Whether opportunities sync is chosen in `,_jsx(_components.strong,{children:`Choose data`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Setting`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Default Stage`})}),_jsx(_components.td,{children:`The starting stage for new opportunities`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Default Type`})}),_jsx(_components.td,{children:`The default opportunity type`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Fallback Sales Rep`})}),_jsx(_components.td,{children:`Sales rep assigned when the user doesn’t have a linked ConnectWise member`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Linked planner item refresh`})}),_jsx(_components.td,{children:`Which planner fields are refreshed when a linked opportunity syncs, plus status and type mappings`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`review-and-finish-setup`,children:`Review and finish setup`}),`\n`,_jsxs(_components.p,{children:[`Open `,_jsx(_components.strong,{children:`Review`}),` and resolve any required incomplete tasks before selecting `,_jsx(_components.strong,{children:`Finish setup`}),`. Each task saves its own changes; finishing setup does not apply a separate batch of pending company or user imports. Imports and syncs keep running in the background, so check their results.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`managing-your-integration`,children:`Managing Your Integration`}),`\n`,_jsxs(_components.p,{children:[`Open the connection from `,_jsx(_components.strong,{children:`Settings`}),` > `,_jsx(_components.strong,{children:`Integrations`}),` to manage it:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Overview`}),` and `,_jsx(_components.strong,{children:`Sync activity`}),` show the connection’s health, matches and the outcome of each sync run.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Run sync`}),` in the connection header starts a sync for all data or for one dataset, such as tickets or PSA reference data.`]}),`\n`,_jsxs(_components.li,{children:[`Any setup task can be reopened from the `,_jsx(_components.strong,{children:`Setup guide`}),` to change its settings.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`On the ConnectWise Manage row in `,_jsx(_components.strong,{children:`Settings`}),` > `,_jsx(_components.strong,{children:`Integrations`}),`, the row’s `,_jsx(_components.strong,{children:`More actions`}),` menu also offers:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Sync PSA data`}),`: Refresh configuration data (priorities, boards, statuses, types) from ConnectWise. See `,_jsx(_components.a,{href:`/user-guides/integrations/connectwise-resync-psa-settings`,children:`Re-sync PSA Settings`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Import configurations`}),`: Open the `,_jsx(_components.strong,{children:`Import devices`}),` task, where you map ConnectWise configuration types to MSPortal device types, turn on auto-import, and ignore records you don’t need. See `,_jsx(_components.a,{href:`/user-guides/integrations/import-devices`,children:`Import Devices`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`To remove the integration, open `,_jsx(_components.strong,{children:`More actions`}),` in the connection header and choose `,_jsx(_components.strong,{children:`Disconnect…`}),`. Review the confirmation: disconnecting removes the stored credentials, company matches and data synced from this connection, and cannot be undone. Disconnecting does not revoke the API keys in ConnectWise; delete them there separately.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`devices-from-connectwise-configurations`,children:`Devices from ConnectWise configurations`}),`\n`,_jsxs(_components.p,{children:[`MSPortal treats an RMM, MDM or network tool as the source of truth for a device. When an RMM is connected, a ConnectWise configuration keeps or creates a device only when its type has `,_jsx(_components.strong,{children:`Auto-import`}),` on and is not ignored in `,_jsx(_components.a,{href:`/user-guides/integrations/import-devices`,children:`Import Devices`}),`. Configurations of other types add their details to devices your RMM reports.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Configurations removed in ConnectWise.`}),` Once a day MSPortal checks the full list of active configurations in ConnectWise. A configuration that is deleted or made inactive is removed from staging three days after ConnectWise stops listing it, and stays if it comes back in the meantime.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`What happens to the device.`}),` When the configuration leaves staging, its device moves to another integration that still reports it, such as your RMM. A device nothing else reports is removed. In a tenant with an RMM, an IT Glue or other PSA record keeps the device only when its type has Auto-import on.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Only companies still mapped to this connection are affected. Unmapping a company or excluding a type stops syncing those records and keeps their devices. Archived devices are never removed.`}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Issue`}),_jsx(_components.th,{children:`Solution`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Connection test fails`}),_jsx(_components.td,{children:`Verify the site address (no https://), Company ID, and API keys are correct`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`A data option is locked or unavailable`}),_jsxs(_components.td,{children:[`Check the `,_jsx(_components.strong,{children:`Permissions`}),` result for that area, grant the permission in ConnectWise and click `,_jsx(_components.strong,{children:`Re-check`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Missing companies after sync`}),_jsxs(_components.td,{children:[`Check if company types or statuses are excluded in `,_jsx(_components.strong,{children:`Choose data`}),`, the sync result and company matches`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Permission errors`}),_jsx(_components.td,{children:`Verify the API member has the MSPortal security role assigned`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Sync not starting`}),_jsxs(_components.td,{children:[`Check the connection status. A paused connection must be reactivated before `,_jsx(_components.strong,{children:`Run sync`}),` works.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tickets from wrong boards`}),_jsxs(_components.td,{children:[`Verify the correct boards are selected in `,_jsx(_components.strong,{children:`Ticket Sync Scope`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Contacts not importing`}),_jsxs(_components.td,{children:[`Verify `,_jsx(_components.strong,{children:`Contact Auto-Import`}),` is on and a default role is selected in `,_jsx(_components.strong,{children:`Choose data`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`New boards or statuses are missing`}),_jsxs(_components.td,{children:[`Run `,_jsx(_components.a,{href:`/user-guides/integrations/connectwise-resync-psa-settings`,children:`Sync PSA data`}),`, then check the boards selected in `,_jsx(_components.strong,{children:`Choose data`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Setup finished but records are absent`}),_jsxs(_components.td,{children:[`Check pending imports, background errors in `,_jsx(_components.strong,{children:`Sync activity`}),` and the selected company`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Changing a project ticket status fails with a security error`}),_jsxs(_components.td,{children:[`Check `,_jsx(_components.strong,{children:`Project Tickets`}),` > `,_jsx(_components.strong,{children:`Edit Level`}),` on the API member’s role. `,_jsx(_components.strong,{children:`Project Ticket Tasks`}),` Edit is a different permission.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Only closing a project or ticket fails`}),_jsxs(_components.td,{children:[`Check `,_jsx(_components.strong,{children:`Close Projects`}),` or `,_jsx(_components.strong,{children:`Close Project Tickets`}),` Edit access and ConnectWise’s required closure fields`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Creating a project or applying a template fails`}),_jsxs(_components.td,{children:[`Check Add access to `,_jsx(_components.strong,{children:`Project Headers`}),`, `,_jsx(_components.strong,{children:`Project Phase`}),` and `,_jsx(_components.strong,{children:`Project Tickets`}),`, plus lookup access. Check records already created before retrying.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Checklist deletion is unavailable`}),_jsxs(_components.td,{children:[`Check `,_jsx(_components.strong,{children:`Project Ticket Tasks`}),` > `,_jsx(_components.strong,{children:`Delete Level: All`}),` and whether MSPortal can verify the API member’s role`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Adding a checklist item fails with a security error`}),_jsxs(_components.td,{children:[`Check `,_jsx(_components.strong,{children:`Project Ticket Tasks`}),` > `,_jsx(_components.strong,{children:`Add Level`}),` on the API member’s role. A successful project read check does not verify creation access.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Checklist completion changes fail`}),_jsxs(_components.td,{children:[`Check `,_jsx(_components.strong,{children:`Project Ticket Tasks`}),` > `,_jsx(_components.strong,{children:`Edit Level`}),` on the same role`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Checklist permissions could not be verified`}),_jsxs(_components.td,{children:[`Review the API member’s role in ConnectWise. Restricted access to security settings, `,_jsx(_components.strong,{children:`My`}),` levels or a temporary API failure can block the check.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`frequently-asked-questions`,children:`Frequently asked questions`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Does Test connection save the connection?`,id:`does-test-connection-save-the-connection`,children:_jsxs(_components.p,{children:[`No. Select `,_jsx(_components.strong,{children:`Save and continue`}),` after a successful test to create a connection, or `,_jsx(_components.strong,{children:`Save changes`}),` to save replacement credentials on an existing connection.`]})}),_jsx(Accordion,{title:`Does a green permissions result verify ticket writes?`,id:`does-a-green-permissions-result-verify-ticket-writes`,children:_jsx(_components.p,{children:`Not every write. Sync checks probe read access, while Project checklist writes reads the API member’s task permission levels without changing data. Creating tickets, comments or other ConnectWise changes still needs the relevant write permission and a successful action.`})}),_jsx(Accordion,{title:`Does MSPortal write back to ConnectWise, or is it one way?`,id:`does-msportal-write-back-to-connectwise-or-is-it-one-way`,children:_jsxs(_components.p,{children:[`It writes back. Project status, ticket status, ticket owners, and project, phase and ticket dates you change in MSPortal are written to ConnectWise, so you do not update them again there. Milestones and onboarding portal dates stay in MSPortal. See `,_jsx(_components.a,{href:`#what-msportal-writes-back-to-connectwise-projects`,children:`What MSPortal writes back to ConnectWise projects`}),`.`]})}),_jsx(Accordion,{title:`Does Finish setup mean all data is ready?`,id:`does-finish-setup-mean-all-data-is-ready`,children:_jsx(_components.p,{children:`No. Check the background sync result and verify company, user and device imports separately.`})}),_jsx(Accordion,{title:`Will every discovered contact receive portal access?`,id:`will-every-discovered-contact-receive-portal-access`,children:_jsx(_components.p,{children:`No. Discovery and import are separate. Review user matches, company links and the permissions assigned to portal users; invitation is a separate workflow.`})}),_jsx(Accordion,{title:`Can I replace saved credentials by retesting the form?`,id:`can-i-replace-saved-credentials-by-retesting-the-form`,children:_jsxs(_components.p,{children:[`A retest only verifies access. Select `,_jsx(_components.strong,{children:`Save changes`}),` after testing the replacement credentials, then confirm the saved connection before revoking the old keys in ConnectWise.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`related-guides`,children:`Related guides`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/user-guides/integrations/connectwise-resync-psa-settings`,children:`Re-sync PSA Settings`}),` - Refresh configuration data from ConnectWise`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/user-guides/integrations/clear-and-resync-integrations`,children:`Clear and Resync Tickets`}),` - Perform a full ticket resync if needed`]}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/user-guides/settings/integrations`,children:`Integration settings`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/user-guides/settings/integration-company-mapping`,children:`Company mapping`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/user-guides/settings/tickets`,children:`Ticket settings`})}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/user-guides/integrations/faq`,children:`Integrations FAQ`}),` - Common questions about integrations`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Configure ConnectWise Manage Integration","description":"Connect your ConnectWise Manage instance to MSPortal.ai and choose what it syncs","icon":"plug","href":"/user-guides/integrations/enable-connectwise-integration"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Part 1: Configure ConnectWise Manage","slug":"part-1-configure-connectwise-manage","depth":2,"children":[{"title":"Create Security Role","slug":"create-security-role","depth":3,"children":[]},{"title":"Create API Member","slug":"create-api-member","depth":3,"children":[]}]},{"title":"Project management permissions","slug":"project-management-permissions","depth":2,"children":[{"title":"What MSPortal writes back to ConnectWise projects","slug":"what-msportal-writes-back-to-connectwise-projects","depth":3,"children":[]},{"title":"Allow project checklist changes","slug":"allow-project-checklist-changes","depth":3,"children":[]}]},{"title":"Part 2: Connect ConnectWise Manage in MSPortal","slug":"part-2-connect-connectwise-manage-in-msportal","depth":2,"children":[{"title":"Connect","slug":"connect","depth":3,"children":[]},{"title":"Permissions","slug":"permissions","depth":3,"children":[]},{"title":"Choose data","slug":"choose-data","depth":3,"children":[]},{"title":"Import or match companies","slug":"import-or-match-companies","depth":3,"children":[]},{"title":"Import or match users","slug":"import-or-match-users","depth":3,"children":[]},{"title":"Import devices","slug":"import-devices","depth":3,"children":[]},{"title":"Configure tickets","slug":"configure-tickets","depth":3,"children":[]},{"title":"Configure opportunities","slug":"configure-opportunities","depth":3,"children":[]},{"title":"Review and finish setup","slug":"review-and-finish-setup","depth":3,"children":[]}]},{"title":"Managing Your Integration","slug":"managing-your-integration","depth":2,"children":[]},{"title":"Devices from ConnectWise configurations","slug":"devices-from-connectwise-configurations","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Frequently asked questions","slug":"frequently-asked-questions","depth":2,"children":[]},{"title":"Related guides","slug":"related-guides","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/msportal/d65dc731b8cde0aa/roadmap-embed.js"],"subdomain":"msportal","siteName":"MSPortal.ai Documentation","title":"Configure ConnectWise Manage Integration - MSPortal.ai Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-11T22:44:39.777Z","originalFileLocation":"user-guides/integrations/enable-connectwise-integration.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Connect your ConnectWise Manage instance to MSPortal.ai and choose what it syncs\">\u003cmeta data-mint-head name=\"application-name\" content=\"MSPortal.ai Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Configure ConnectWise Manage Integration - MSPortal.ai Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Connect your ConnectWise Manage instance to MSPortal.ai and choose what it syncs\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"MSPortal.ai Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.msportal.ai/user-guides/integrations/enable-connectwise-integration\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://msportal.mintlify.site/_mintlify/api/og/v2?division=PSA+and+ticketing\u0026amp;title=Configure+ConnectWise+Manage+Integration\u0026amp;description=Connect+your+ConnectWise+Manage+instance+to+MSPortal.ai+and+choose+what+it+syncs\u0026amp;theme=88706d4dcbb07b7aeafbf701\u0026amp;signature=d91260fb84b71b0711f12e609cd52aa3c5b0d779b1a65db37da3a6fead948f81\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Configure ConnectWise Manage Integration - MSPortal.ai Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Connect your ConnectWise Manage instance to MSPortal.ai and choose what it syncs\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://msportal.mintlify.site/_mintlify/api/og/v2?division=PSA+and+ticketing\u0026amp;title=Configure+ConnectWise+Manage+Integration\u0026amp;description=Connect+your+ConnectWise+Manage+instance+to+MSPortal.ai+and+choose+what+it+syncs\u0026amp;theme=88706d4dcbb07b7aeafbf701\u0026amp;signature=d91260fb84b71b0711f12e609cd52aa3c5b0d779b1a65db37da3a6fead948f81\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/msportal/MdEo74vho503Sp8Y/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"MSPortal.ai Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0C8376\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.msportal.ai/user-guides/integrations/enable-connectwise-integration\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/user-guides/integrations/enable-connectwise-integration.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.msportal.ai/#organization\",\"name\":\"MSPortal.ai Documentation\",\"url\":\"https://docs.msportal.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/msportal/KnbwIXtZSTlVJTt6/logo/light.svg?fit=max\u0026auto=format\u0026n=KnbwIXtZSTlVJTt6\u0026q=85\u0026s=eb69f6d6bf16b2c401770aef19ade1d2\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.msportal.ai#website\",\"name\":\"MSPortal.ai Documentation\",\"url\":\"https://docs.msportal.ai\",\"publisher\":{\"@id\":\"https://docs.msportal.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.msportal.ai/user-guides/integrations/enable-connectwise-integration#webpage\",\"url\":\"https://docs.msportal.ai/user-guides/integrations/enable-connectwise-integration\",\"name\":\"Configure ConnectWise Manage Integration\",\"description\":\"Connect your ConnectWise Manage instance to MSPortal.ai and choose what it syncs\",\"dateModified\":\"2026-11-11T22:44:39.777Z\",\"isPartOf\":{\"@id\":\"https://docs.msportal.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.msportal.ai/user-guides/integrations/enable-connectwise-integration#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.msportal.ai/user-guides/integrations/enable-connectwise-integration#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"MSPortal.ai Documentation\",\"item\":\"https://docs.msportal.ai\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Configure ConnectWise Manage Integration\",\"item\":\"https://docs.msportal.ai/user-guides/integrations/enable-connectwise-integration\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.msportal.ai/user-guides/integrations/enable-connectwise-integration#article\",\"headline\":\"Configure ConnectWise Manage Integration\",\"name\":\"Configure ConnectWise Manage Integration\",\"description\":\"Connect your ConnectWise Manage instance to MSPortal.ai and choose what it syncs\",\"url\":\"https://docs.msportal.ai/user-guides/integrations/enable-connectwise-integration\",\"mainEntityOfPage\":{\"@id\":\"https://docs.msportal.ai/user-guides/integrations/enable-connectwise-integration#webpage\"},\"dateModified\":\"2026-11-11T22:44:39.777Z\",\"publisher\":{\"@id\":\"https://docs.msportal.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.msportal.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"MSPortal.ai Documentation\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"MSPortal.ai Documentation\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/user-guides/integrations/enable-connectwise-integration.md","siteName":"MSPortal.ai Documentation","nav":{"global":null,"tabs":[{"tab":"Company Guides","pages":[{"title":"Company Guides","href":"/user-guides/account/manage-your-profile"}]},{"tab":"MSP Guides","anchors":[{"anchor":"Getting started","icon":"rocket","pages":[{"title":"Getting started","href":"/user-guides/getting-started"}]},{"anchor":"Planning","icon":"compass","pages":[{"title":"Planning","href":"/user-guides/company-overview"}]},{"anchor":"Operations","icon":"briefcase","pages":[{"title":"Operations","href":"/user-guides/client-onboarding"}]},{"anchor":"Protection","icon":"shield-halved","pages":[{"title":"Protection","href":"/user-guides/cloud"}]},{"anchor":"MSP Tools","icon":"toolbox","pages":[{"title":"MSP Tools","href":"/user-guides/msp-tools"}]},{"anchor":"Administration","icon":"gear","pages":[{"title":"Administration","href":"/user-guides/settings"}]},{"anchor":"Integrations","icon":"plug","groups":[{"group":"Overview, imports and sync","pages":[{"title":"Integration setup guides","icon":"plug","href":"/user-guides/integrations"},{"title":"Integration troubleshooting","icon":"plug","href":"/user-guides/integrations/faq"},{"title":"Sync Schedules","href":"/user-guides/integrations/sync-schedules"},{"title":"Import Users","icon":"plug","href":"/user-guides/integrations/import-users"},{"title":"Import Companies","icon":"plug","href":"/user-guides/integrations/import-companies"},{"title":"Import Devices","icon":"server","href":"/user-guides/integrations/import-devices"},{"title":"Clear and Resync Integrations","icon":"plug","href":"/user-guides/integrations/clear-and-resync-integrations"},{"title":"Warranty Writeback to Hudu and IT Glue Flexible Assets","icon":"shield-halved","href":"/user-guides/integrations/documentation-warranty-writeback"},{"title":"Warranty Writeback to Autotask","icon":"arrows-rotate","href":"/user-guides/integrations/autotask-warranty-writeback"},{"title":"Warranty Writeback to IT Glue Configurations","description":"Write warranty expiration dates from MSPortal to the IT Glue configuration linked to each device.","icon":"arrows-rotate","href":"/user-guides/integrations/itglue-configuration-warranty-writeback"}]},{"group":"PSA and ticketing","pages":[{"title":"Configure ConnectWise Manage Integration","icon":"plug","href":"/user-guides/integrations/enable-connectwise-integration"},{"title":"Configure ConnectWise Asio Integration","description":"Connect ConnectWise Asio, map companies to companies, and import device inventory","icon":"plug","href":"/user-guides/integrations/enable-connectwise-asio-integration"},{"title":"Resync ConnectWise PSA Settings","icon":"arrows-rotate","href":"/user-guides/integrations/connectwise-resync-psa-settings"},{"title":"Configure Autotask PSA Integration","icon":"plug","href":"/user-guides/integrations/enable-autotask-integration"},{"title":"Configure Halo PSA Integration","icon":"plug","href":"/user-guides/integrations/enable-halo-integration"},{"title":"Create Custom Halo PSA Role and API User","icon":"user-shield","href":"/user-guides/integrations/halo-psa-custom-role-and-user"},{"title":"Configure Syncro Integration","icon":"plug","href":"/user-guides/integrations/enable-syncro-integration"},{"title":"Configure NinjaOne Integration","icon":"plug","href":"/user-guides/integrations/enable-ninjaone-integration"},{"title":"Configure NinjaOne Ticketing Integration","icon":"ticket","href":"/user-guides/integrations/enable-ninjaone-ticketing-integration"}]},{"group":"RMM and networks","pages":[{"title":"Configure Addigy Integration","icon":"apple","href":"/user-guides/integrations/enable-addigy-integration"},{"title":"Configure Datto RMM Integration","icon":"plug","href":"/user-guides/integrations/enable-datto-rmm-integration"},{"title":"Configure N-able N-central Integration","icon":"server","href":"/user-guides/integrations/enable-ncentral-integration"},{"title":"Configure Action1 Integration","icon":"plug","href":"/user-guides/integrations/enable-action1-integration"},{"title":"Configure Cisco Meraki Integration","icon":"network-wired","href":"/user-guides/integrations/enable-meraki-integration"},{"title":"Configure UniFi Console Integration","icon":"wifi","href":"/user-guides/integrations/enable-unifi-integration"},{"title":"Connect Domotz and Review Network Health","icon":"network-wired","href":"/user-guides/integrations/enable-domotz-integration"},{"title":"Configure Fortinet Integration","icon":"plug","href":"/user-guides/integrations/enable-fortinet-integration"},{"title":"Neo Agent Compatibility","icon":"robot","href":"/user-guides/integrations/neo-agent"},{"title":"Connect Auvik and review network data","icon":"plug","href":"/user-guides/integrations/enable-auvik-integration"},{"title":"Provide LogicMonitor API access","icon":"plug","href":"/user-guides/integrations/enable-logicmonitor-integration"},{"title":"Connect WatchGuard Cloud","icon":"plug","href":"/user-guides/integrations/enable-watchguard-integration"}]},{"group":"Security and training","pages":[{"title":"Configure Cork Integration","icon":"shield-halved","href":"/user-guides/integrations/enable-cork-integration"},{"title":"Configure Huntress Integration","icon":"shield-dog","href":"/user-guides/integrations/enable-huntress-integration"},{"title":"Configure Wirespeed Integration","icon":"shield-halved","href":"/user-guides/integrations/enable-wirespeed-integration"},{"title":"Configure Petra Security Integration","icon":"plug","href":"/user-guides/integrations/enable-petra-integration"},{"title":"Configure Bitdefender GravityZone Integration","icon":"plug","href":"/user-guides/integrations/enable-bitdefender-integration"},{"title":"Configure RoboShadow Integration","icon":"plug","href":"/user-guides/integrations/enable-roboshadow-integration"},{"title":"Configure Cyrisma Integration","icon":"plug","href":"/user-guides/integrations/enable-cyrisma-integration"},{"title":"Configure ScoutDNS Integration","icon":"plug","href":"/user-guides/integrations/enable-scoutdns-integration"},{"title":"Configure Breach Secure Now Integration","icon":"shield-halved","href":"/user-guides/integrations/enable-breach-secure-now-integration"},{"title":"Configure Phin Security Integration","icon":"shield-halved","href":"/user-guides/integrations/enable-phin-integration"},{"title":"Connect Phished.io","icon":"shield-halved","href":"/user-guides/integrations/enable-phished-integration"},{"title":"Configure CyberHoot Integration","icon":"graduation-cap","href":"/user-guides/integrations/enable-cyberhoot-integration"},{"title":"Connect Avanan and map customer tenants","icon":"plug","href":"/user-guides/integrations/enable-avanan-integration"},{"title":"Provide Blackpoint Cyber API access","icon":"plug","href":"/user-guides/integrations/enable-blackpoint-cyber-integration"},{"title":"Provide Cisco Umbrella API access","icon":"plug","href":"/user-guides/integrations/enable-cisco-umbrella-integration"},{"title":"Connect DNSFilter and map organizations","icon":"plug","href":"/user-guides/integrations/enable-dnsfilter-integration"},{"title":"Provide Mimecast API access","icon":"plug","href":"/user-guides/integrations/enable-mimecast-integration"},{"title":"Connect ThreatMate and map customers","icon":"plug","href":"/user-guides/integrations/enable-threatmate-integration"},{"title":"Provide VulScan API access","icon":"plug","href":"/user-guides/integrations/enable-vulscan-integration"}]},{"group":"Backup","pages":[{"title":"Configure Cove Backup Integration","icon":"database","href":"/user-guides/integrations/enable-cove-backup-integration"},{"title":"Configure Acronis Cyber Protect Integration","icon":"cloud-arrow-down","href":"/user-guides/integrations/enable-acronis-integration"},{"title":"Configure Spanning Backup Integration","icon":"cloud-arrow-up","href":"/user-guides/integrations/enable-spanning-integration"},{"title":"Configure Kaseya SaaS Protection Integration","icon":"database","href":"/user-guides/integrations/enable-kaseya-saas-protection-integration"},{"title":"Connect Datto Backup","icon":"plug","href":"/user-guides/integrations/enable-datto-backup-integration"},{"title":"Connect NinjaOne SaaS Backup","icon":"plug","href":"/user-guides/integrations/enable-ninjaone-saas-backup-integration"},{"title":"Connect Slide Backup","icon":"plug","href":"/user-guides/integrations/enable-slide-integration"}]},{"group":"Documentation and client portals","pages":[{"title":"Configure Hudu Integration","icon":"book","href":"/user-guides/integrations/enable-hudu-integration"},{"title":"Configure IT Glue Integration","icon":"book","href":"/user-guides/integrations/enable-itglue-integration"},{"title":"Sync IT Glue Document Folders","icon":"shield-halved","href":"/user-guides/integrations/itglue-sync-folders"},{"title":"Configure Liongard Integration","icon":"magnifying-glass-chart","href":"/user-guides/integrations/enable-liongard-integration"},{"title":"Configure CloudRadial Integration","icon":"cloud","href":"/user-guides/integrations/enable-cloudradial-integration"}]},{"group":"Cloud and domains","pages":[{"title":"Connect rollout companies to Microsoft 365","sidebarTitle":"Connect rollout companies to Microsoft 365","icon":"cloud","href":"/user-guides/getting-started/onboarding/company-m365"},{"title":"Security of MSPortal's Microsoft apps","sidebarTitle":"Microsoft app security","icon":"shield-check","href":"/user-guides/integrations/microsoft-app-security"},{"title":"Connect Google Workspace","icon":"google","href":"/user-guides/integrations/enable-google-workspace-integration"},{"title":"Configure CIPP Integration","icon":"cloud","href":"/user-guides/integrations/enable-cipp-integration"},{"title":"Configure Pax8 Integration","icon":"boxes-stacked","href":"/user-guides/integrations/enable-pax8-integration"},{"title":"Set Up Pax8 for Subscriptions and Storefront","icon":"plug","href":"/user-guides/licensing/setup"},{"title":"Configure Sherweb Integration","icon":"cloud","href":"/user-guides/integrations/enable-sherweb-integration"},{"title":"Configure Adobe Enterprise Integration","icon":"file-pdf","href":"/user-guides/integrations/enable-adobe-enterprise-integration"},{"title":"Configure Intermedia Integration","icon":"phone","href":"/user-guides/integrations/enable-intermedia-integration"},{"title":"Configure DNSimple Integration","icon":"globe","href":"/user-guides/integrations/enable-dnsimple-integration"},{"title":"Configure Cloudflare Integration","icon":"plug","href":"/user-guides/integrations/enable-cloudflare-integration"},{"title":"Provide Ingram Micro API access","icon":"plug","href":"/user-guides/integrations/enable-ingram-micro-integration"},{"title":"Provide TD SYNNEX API access","icon":"plug","href":"/user-guides/integrations/enable-td-synnex-integration"}]},{"group":"Sales, payments and scheduling","pages":[{"title":"Connect and manage Quoter","icon":"plug","href":"/user-guides/quotes/setup"},{"title":"Troubleshoot missing Quoter quotes and company links","icon":"magnifying-glass","href":"/user-guides/quotes/troubleshoot-quoter-quotes"},{"title":"Configure QuoteWerks Integration","icon":"file-invoice-dollar","href":"/user-guides/integrations/enable-quotewerks-integration"},{"title":"Map QuoteWerks customers to companies","icon":"file-invoice-dollar","href":"/user-guides/integrations/map-quotewerks-customers"},{"title":"Troubleshoot QuoteWerks quotes and QuoteValet links","icon":"file-invoice-dollar","href":"/user-guides/quotes/troubleshoot-quotewerks-quotes"},{"title":"Configure Salesbuildr Integration","icon":"file-invoice-dollar","href":"/user-guides/integrations/enable-salesbuildr-integration"},{"title":"Map Salesbuildr companies for quote access","icon":"file-invoice-dollar","href":"/user-guides/integrations/map-salesbuildr-companies"},{"title":"Troubleshoot Salesbuildr quotes and PDFs","icon":"file-invoice-dollar","href":"/user-guides/quotes/troubleshoot-salesbuildr-quotes"},{"title":"Configure HubSpot Integration","icon":"handshake","href":"/user-guides/integrations/enable-hubspot-integration"},{"title":"Configure Benji Pays Integration","icon":"credit-card","href":"/user-guides/integrations/enable-benjipays-integration"},{"title":"Configure TimeZest Integration","icon":"calendar-clock","href":"/user-guides/integrations/enable-timezest-integration"},{"title":"Configure Simplesat Integration","icon":"face-smile","href":"/user-guides/integrations/enable-simplesat-integration"},{"title":"Configure SmileBack Integration","icon":"face-smile-beam","href":"/user-guides/integrations/enable-smileback-integration"},{"title":"Configure Microsoft Teams Integration","icon":"microsoft","href":"/user-guides/integrations/enable-teams-integration"},{"title":"Provide CrewHu API access","icon":"plug","href":"/user-guides/integrations/enable-crewhu-integration"},{"title":"Connect Fellow meeting notes","icon":"plug","href":"/user-guides/integrations/enable-fellow-integration"}]}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/budgets/list-budgets"}]},{"tab":"Release Notes","pages":[{"title":"Release Notes","href":"/release-notes"}]}]},"basePath":"","title":"Configure ConnectWise Manage Integration - MSPortal.ai Documentation","buildId":"dpl_5joLUXmnJgwqjrHAS4dxZrQTdxgh","deploymentId":"dpl_5joLUXmnJgwqjrHAS4dxZrQTdxgh","dynamics":[],"chunks":[]}