ConnectWise Manage Integration
ScopeStack integrates with ConnectWise Manage to pull opportunities into the platform for project creation, automatically sync forecast revenue back to ConnectWise as your deal progresses, and push approved projects into ConnectWise as PSA projects with work plan tickets and tasks.
Prerequisites
- A ConnectWise Manage API Member user with the permissions listed below
- ScopeStack Connected Apps permission at the Manage level
Setting Up in ConnectWise
ConnectWise requires a dedicated API Member user. API Members do not consume a user license.
- In ConnectWise, go to System > Members and open the API Members tab.
- Create a new API Member and generate API Keys for the user.
- Copy the Public Key and Private Key — you will need them when configuring ScopeStack.
- Assign the following permissions to the API Member:
Sales > Opportunity — Inquire/Add/Edit: All
Project > Project Headers — Inquire/Add/Edit: All
Project > Project Tickets — Inquire/Add/Edit: All
Project > Project Ticket Tasks — Inquire/Add/Edit: All
Project > Project Phase — Inquire: All
Companies > Company Maintenance — Inquire: All
Companies > Contacts — Inquire: All
System > Member Maintenance — Inquire: All
System > Table Setup — Inquire: All; Customize: allow at minimum Service Board and Project Status tables; also allow Service Priority and Service Status
Procurement > Product Catalog — Inquire: All
Finance > Agreements — Inquire: All
Note: Giving full admin permissions to the API Member avoids complications with permissions.
On-Premises ConnectWise
If your ConnectWise instance is hosted on-premises, add the following ScopeStack IP addresses to your firewall allow list. Cloud-hosted instances do not require this step.
54.85.50.12918.211.94.1573.231.126.207
Configuring in ScopeStack
Navigate to Settings > Connected Apps > ConnectWise and enter your credentials:
- Open the ConnectWise tile on the Connected Apps page.
- Enter your ConnectWise Host (the URL of your ConnectWise instance).
- Enter your Company ID (your ConnectWise company identifier).
- Enter the Public Key generated for your API Member.
- Enter the Private Key generated for your API Member.
- Click Save to store the credentials.
- Click the Enable toggle to activate the integration.
Configuration Options
Opportunity Status Filter
A comma-separated list of status names for opportunities available to scope. Leave blank to see all opportunities. Use this to limit the integration to only the statuses that indicate an opportunity is active and ready to scope.
Opportunity Stage Filter
A comma-separated list of stage names for opportunities available to scope. Leave blank to see all opportunities. Use this to restrict which pipeline stages appear in ScopeStack.
Skip Revenue Sync
Check this box if you do not want ScopeStack to automatically update opportunity revenue in ConnectWise when your project is submitted for approval. By default, ScopeStack pushes the scoped revenue back to the ConnectWise opportunity at submission time.
Include Product in Revenue Sync
Check this box to include any product selected from ConnectWise when ScopeStack calculates and updates the opportunity revenue. Leave unchecked to sync only service revenue.
Verifying the Connection
A “Connected” status on the ConnectWise tile means your stored credentials are valid. It does not mean data is flowing. The credential check runs separately from the hourly opportunity sync and from the push to PSA, so a connection can read “Connected” while either of those is failing.
To see whether data is actually moving, open Settings > Connected Apps and click into the ConnectWise connection. The connection row shows:
- Status — green for Connected, red for Connection Error.
- Last Sync — when the opportunity sync last completed. If this is hours or days stale on an enabled connection, the sync is failing.
- Additional Information — a running count in the form “198 opportunities imported, 4 projects pushed to PSA”. The second number goes up by one each time a push creates a project in ConnectWise, so it is a quick way to confirm a push got as far as creating the project.
For anything more detailed than these three fields, see Reading the integration activity log.
Creating a ConnectWise Project from ScopeStack
ScopeStack maps project elements to ConnectWise as follows:
- ScopeStack Project Name > ConnectWise Project Name
- ScopeStack Phase > ConnectWise Work Plan Phase
- ScopeStack Services > ConnectWise Work Plan Ticket
- ScopeStack Sub-Services (if selected) > Task under a Work Plan Ticket
- ScopeStack Governance Items (if selected and assigned to a phase) > ConnectWise Ticket
Note: Creating a ConnectWise project does not send any financial data (estimated revenue, cost, or billing amounts) to the ConnectWise project. Only the elements above are pushed: name, dates, board, company, template, and the selected services, sub-services, and governance items. Any dollar values on the ConnectWise project’s Finance tab come from ConnectWise’s own project, company, or board defaults, not from ScopeStack. To sync revenue, link a ConnectWise opportunity to the project and use Opportunity Forecast Sync (below), which updates the linked opportunity’s forecast.
Requirements
- The project must be approved in ScopeStack
- ConnectWise Connected App must be configured
Step-by-Step
Once your project is approved in ScopeStack, you will have the option to Push To PSA. This button appears in the project’s action toolbar next to the approval buttons when your account has a connection with PSA switched on. PSA must also be on for the ConnectWise connection itself: on an account with more than one PSA connection the button can show while this one is off, and the push form then sends you back with a message. To check, open the connection under Settings > Connected Apps, go to the Additional Features tab, and confirm the PSA option is enabled.
Note: Whether the API triggers a push depends on the API version you call.
- v1 — creating a
psa_projectpersists the record but does not trigger the push. Nothing is created in your PSA. Push with the Push To PSA button on an approved project.- v2 —
POSTorPATCHto/v2/projects/:id/psa-projectdoes trigger the push automatically, in the background. Do not also click the in-app button while that push is still running: until it finishes ScopeStack has no PSA project ID yet, and a second run creates a second project in your PSA.
On this screen: The approved project’s action area shows a Push To PSA button when PSA is enabled on a connection in your account. Clicking it opens the ConnectWise project setup form.
On this screen: The ConnectWise project setup form includes fields for How would you like to integrate this project with ConnectWise? (new or existing project), Estimated Start Date, Estimated End Date, ConnectWise Project Board, ConnectWise Company, Initial Ticket Status, and an optional Use Project Template? toggle, and a How should Tickets/Tasks be created? dropdown. At the bottom is a checkbox for Create ConnectWise Tickets for ScopeStack Governance Items?
To complete the setup, define:
-
Estimated Start and End Date for your project.
-
Project Board in ConnectWise Manage to create the project in.
-
ConnectWise Client for your project. This list syncs once per day from ConnectWise.
-
Whether to include governance items as tickets. The platform can only create these if you have assigned your governance items to your project’s phases.
-
How should Tickets/Tasks be created? — a dropdown that controls how Services and Sub-Services map to ConnectWise. The four options are:
- Create a Ticket for each ScopeStack Service — one Work Plan Ticket per service; sub-services are not pushed.
- Create a Ticket for each ScopeStack Service and create a task for each ScopeStack subservice — a ticket per service with each sub-service as a task under it. If a sub-service has a Service Description, that becomes the task name; otherwise the sub-service name is used.
- Create a Ticket for each ScopeStack Service and Subservice with revenue greater than 0 — a ticket per service, plus a ticket for each sub-service that carries revenue.
- Create a Ticket for each ScopeStack Subservice — one ticket per sub-service.
In the two “ticket per Subservice” modes, sub-services push as their own phase-level tickets with no parent-service link.
Governance Item Behavior
- If governance is set to Prorate, each item not assigned to a phase gets a ticket in every phase that includes effort. The effort is distributed across those individual-phased tickets.
- If a governance item is aligned to a specific phase, the ticket is created in that phase with all effort allocated to it.
- If the item is set to a Project Management phase, the ticket is created in a phase called “Project governance” with all effort allocated to it.
After you press Submit, it may take a few minutes for the project to be created. ConnectWise creates it using the API Member you configured.
If a board or existing project you expect is missing from the setup form, contact ScopeStack support with the board or project name. On accounts with a large number of ConnectWise boards, a board can occasionally be missing from the ConnectWise Project Board list.
Updating a Project
After creating the ConnectWise project, resubmitting from the classic PSA Integration section adds missing services and updates existing mapped tickets. On the Push to PSA V2 beta screen, a resubmit of a new-project push with no CRM opportunity can create a second project.
CRM Features
Opportunity Forecast Sync
-
Associate a ConnectWise opportunity to your ScopeStack project using the Opportunity dropdown.
On this screen: The project detail view shows an Opportunity dropdown in the CRM section. Select the matching ConnectWise Manage opportunity from the list to link it to this project.
-
As your deal moves through ScopeStack stages — Building, Pending Approval, Approved, Won, and Lost — the forecast on the linked ConnectWise opportunity updates automatically. The forecast is updated by adding a line for each Product, Professional Service, and Managed Service Total.
-
To sync revenue manually on an approved project, click the Update CRM button in the gear menu next to the project name.
On this screen: The project header shows the project name with a gear icon. Clicking the gear icon opens a context menu containing actions including Update CRM, which triggers a manual sync of revenue data back to the linked ConnectWise Manage opportunity.
Convert to Sales Order
Once a project is approved, you can convert it to a ConnectWise Sales Order.
On this screen: An approved project’s action toolbar includes a Create Sales Order button. Clicking it creates a sales order in ConnectWise Manage from the linked opportunity.
Reading the integration activity log
Every time ScopeStack writes to ConnectWise, it records what it did in an integration activity entry on the connection. When a push to PSA does not produce what you expected, this log is what separates a ConnectWise rejection from a ScopeStack failure, and it shows how far the push got before it stopped. Read this section before working through the troubleshooting entries below, because most of them are distinguished by what the log does and does not contain.
Getting to the log
Open the connection under Settings > Connected Apps and select the Integration Activity tab. You need Manage on the Connected Apps permission to see it, which the Admin role has by default. If you hold only View on that permission, the tab does not appear.
Two other ways to get at it:
-
Ask ScopeStack support. Give them the ScopeStack project number and roughly when you pushed. Both are in the log, so a project number is enough to find the right entry.
-
Read it through the API. The same records are available to any user on your account with API credentials. First list your connections to find the ConnectWise connection ID:
GET https://api.scopestack.io/{account-slug}/v1/account-connectionsThen request that connection’s entries, which come back newest first:
GET https://api.scopestack.io/{account-slug}/v1/account-connections/{connection-id}/integration-logsEach entry has a
contentfield holding the full text of one operation and acreated-attimestamp marking when that operation started. See API Quickstart for how to authenticate.
What one push looks like
A push to PSA writes its progress into a single entry, one line per stage, always in this order:
Upserting PSA project for ScopeStack project 120781
Adding phases (if required)
Adding missing services and subservices
Adding governance (if required)
[ServiceActual] preparing create: source=ProjectService#734428 ...What each stage is doing:
- Upserting PSA project — creating the project in ConnectWise, or attaching to the existing project you selected. The number is the ScopeStack project, which is the one to quote to support.
- Adding phases — your ScopeStack phases are created as ConnectWise Work Plan phases.
- Adding missing services and subservices — this is the stage that creates the Work Plan tickets and tasks. It is normally the longest, and it is the one that matters if your Work Plan came out empty.
- Adding governance — governance items are added as tickets, if you chose that option on the setup form.
[ServiceActual]lines — lines from recording service and sub-service tracking data. Reaching these means the push reached the final recording stage.
A push also writes a second, much larger entry timestamped a second or two after the first. That one records each individual call ScopeStack made to ConnectWise along with ConnectWise’s response, and it is where the detail lives when something was refused. So a single push normally produces two adjacent entries, not one.
Where the log stops tells you what failed
- It stops after “Adding phases”, usually with an error line. The push stopped during the phase stage, before the ticket stage. Check the failure line and the ConnectWise error block, if present, to find the cause. The last line is normally “PSA push failed for ScopeStack project N.” followed by the error. Push again from the PSA Integration section; a resubmit attaches to the project that already exists rather than creating a second one, and it adds whatever is missing. (If your account uses the Push to PSA V2 beta screen and the import choice is a new project with no CRM opportunity, a resubmit can create a second ConnectWise project instead.)
- It reaches the
[ServiceActual]lines. The push reached the final recording stage. Check the per-call log for failed writes as well as the board, template, and “How should Tickets/Tasks be created?” option you selected. - It contains an error block. The call failed. Read the error to distinguish a ConnectWise rejection from a timeout or other connection failure. See below.
What a ConnectWise rejection looks like
When ConnectWise refuses something, the entry carries a block in this shape:
***** Connectwise API Error (400):
Path: https://na.myconnectwise.net/v4_6_release/apis/3.0/sales/opportunities/198/forecast
Payload: {...}
Error: forecast object is invalid. The field forecastDescription must be a string with a maximum length of 50.
*****The Error line is ConnectWise’s own message, and it usually names the exact field it objected to. In the example above, a product name longer than 50 characters was blocking the revenue sync, which is fixable in ScopeStack without involving support. Read that line first, before anything else in the entry.
The number in the header is the HTTP status ConnectWise returned. When the call failed without any HTTP response, such as a timeout, the header shows the name of the error instead of a number. A 403 means the API Member was refused rather than the data being wrong, which points at the API Member’s security role or, on an on-premises instance, at a firewall rule. A 400 means ConnectWise understood the request and rejected the contents.
Reads, write failures, and what the log leaves out
Reads from ConnectWise are logged, but without the records. Each read, such as fetching your project boards, project templates, priorities, members, or the list of existing projects, writes a line with the endpoint it called and a record count. A failed read writes the error instead. The records themselves are not logged. For cached dropdowns, look for reads from the cache refresh: a count of 0 means ConnectWise returned nothing, and an error means the call failed. See the empty-dropdowns entry below for what to do next.
Failed writes and interrupted pushes leave different traces. A failed write made by the API’s ConnectWise adapter records the error block shown above. If a PSA push raises an exception, its progress log also records “PSA push failed for ScopeStack project N.” with the error class and message. When an error is saved on the PSA project, its PSA page shows a banner reading “Could not create PSA project.” followed by the saved error text.
A generic ScopeStack error page is not a ConnectWise error. If the screen goes to a page reading “Be right back. We need to check some things out.”, that is ScopeStack’s own error page, not something ConnectWise sent. This page alone does not show whether a ConnectWise call ran or whether the integration log contains an entry. Send support the time it happened and what you clicked.
Troubleshooting
A dropdown says “This list has not been cached yet”
Since September 2026, the Push to PSA screen fills its board, status, priority and template dropdowns from a cache that refreshes once a day, rather than calling ConnectWise each time you open the page. That makes the page fast, and it means a list can be empty for reasons that have nothing to do with your credentials. Three different messages appear under an empty dropdown and they mean different things:
- “This list has not been cached yet. A refresh has been requested — reload in a few minutes.” Nothing has been fetched for this connection yet. Opening the page requests a refresh, so reload rather than reconfiguring anything.
- “This list was empty when it was last refreshed on [date]. Check that it is configured in your PSA.” We asked and ConnectWise returned nothing. The thing you are looking for does not exist in ConnectWise, or the API member cannot see it. Telling this customer to wait will not help.
- “[error]. Showing the list cached on [date].” The refresh failed and you are looking at older data. The error text is the place to start. Where nothing was ever cached, you get the error on its own without the second sentence.
Read this entry before the older empty-dropdown entries further down. Those were written before the cache existed and assume a live call, so they will send you to the security role or to support when the message under the dropdown already tells you which of the three cases you are in.
Two consequences. A board, status or template you have just created in ConnectWise will not appear until the next daily refresh. And PSA features have to be switched on for the connection before any of these lists populate at all: open the connection under Settings > Connected Apps, check the Additional Features tab, and confirm the PSA option is enabled.
403 Forbidden errors on opportunity sync
The most common cause is the ConnectWise API Member losing permissions. After a ConnectWise Manage update or security policy change, API Member permissions can be reset. Check that your API Member still has the permissions listed in the Prerequisites section above. Specifically verify:
- Sales > Opportunity: Inquire/Add/Edit = All
- Companies > Company Maintenance: Inquire = All
Note that the connection will still show “Connected” while this is happening, because the credential check and the sync are separate.
If your ConnectWise instance is hosted on-premises and the permissions are correct, treat a 403 as a network problem rather than a permissions one, especially if the errors started abruptly on a particular date. Confirm the three ScopeStack IP addresses in the Prerequisites section are still on your firewall allow list; ConnectWise updates and firewall migrations can drop allow-list entries without anyone noticing.
If neither applies, contact ScopeStack support with the error details from the integration activity log.
The board, template, or priority dropdowns on the Push to PSA form are empty
If the ConnectWise Project Board, Use Project Template, or Initial Ticket Status lists come back empty while your opportunities are still syncing normally, the cause is almost always the security role on the API Member, not the connection.
Opportunities come from ConnectWise’s Sales area. Boards, templates, priorities, and members come from the Service, Project, and System areas. A role that has Sales access but has lost the others produces exactly this split: the sync keeps working and every dropdown goes blank. The integration activity log shows these reads with an error or a count of 0 rather than the data.
The mistake worth avoiding: making your own ConnectWise login an Admin does not change anything, because ScopeStack does not use your login. It uses the API Member whose keys are stored on the connection. In ConnectWise, go to System > Members > API Members, find the member whose API Keys tab shows the Public Key you entered in ScopeStack, and check that member’s security role covers the Service, Project, and System areas listed in the Prerequisites section, not just Sales.
The “Use Existing Project” list is empty
The list asks ConnectWise for projects matching three conditions at once: not closed, on the selected board, and belonging to the selected company. If any one of them excludes everything, you get an empty list with no message.
Work through them in this order, because that is roughly how often each one is the cause:
- No board selected. Board is required. Until you pick one, the list is empty no matter what else is set.
- The project you are looking for is closed. Closed ConnectWise projects are filtered out and cannot be selected.
- Wrong board. The right company on the wrong board returns nothing.
- The company has no mapping. ScopeStack matches on the ConnectWise company id it holds for the client record your project is linked to. If your account has duplicate client records for the same customer, each carries its own mapping, so a project linked to the unmapped duplicate has no company id to search with.
While you work through that list, note that a failed call to ConnectWise also renders as an empty list rather than an error on screen, though the integration log records the failed read. An empty picker does not by itself mean no matching projects exist.
The push finished but the Work Plan is empty
If phases appear in ConnectWise and the Work Plan has no tickets, check the project’s PSA page for a “Could not create PSA project.” banner and the integration log for a “PSA push failed” line. Phases are processed before tickets, but an empty Work Plan alone does not establish where or why the push stopped. Resubmit from the PSA Integration section; the resubmit attaches to the ConnectWise project that already exists and adds what is missing, so you will not get a duplicate project. (On the Push to PSA V2 beta screen, a resubmit of a new-project push with no CRM opportunity can create a second project.) If it stops in the same place twice, send ScopeStack support the ScopeStack project number and the approximate time of the push.
You recreated the ConnectWise API Member and now nothing works
Deleting and recreating an API Member issues new keys, and the keys stored in ScopeStack are still the old ones. Go to Settings > Connected Apps > ConnectWise and re-enter the Public Key and Private Key from the new member, then Save.
Those two, plus the Company ID, are the whole credential. There is no Client ID or Client Secret to update on this screen; the ConnectWise integration identifier ScopeStack sends is set at the platform level, not per API Member, so recreating a member never affects it.
This is not limited to Push to PSA. Those keys are the only credential ScopeStack holds for that connection, and everything on it authenticates the same way: opportunity sync, revenue write-back, pushes to ConnectWise Projects, and product catalog lookups. Until the new keys are saved, all of it stops. If you have more than one ConnectWise connection, only the one holding the recreated member’s keys is affected.
You will usually see this as the connection flipping to Connection Error with a notification, because a rejected credential returns a 401 and ScopeStack marks the connection failed. That is the opposite of the 403 permissions case above, where the connection keeps reporting Connected while the sync fails quietly. A red connection points at the credential; a green connection with failing syncs points at the security role.
New to ScopeStack?
ScopeStack automates scoping, pricing, and SOW generation for IT services teams. See how it fits your process.