ConnectWise PSA agreement margin board for monthly reviews
Rank every active agreement by the hours it is actually eating, see the real hourly rate you are earning, and investigate the ones losing money.
I run an MSP on ConnectWise PSA. Build me an agreement margin board that we open for our monthly profitability review. Agreement profitability is the one number everyone ends up rebuilding in a spreadsheet, so this needs to be a surface we come back to every month, not a one-off report.
Main view: a date range picker at the top, defaulting to the last full calendar month, and a table of every active agreement in that range. Use List Agreements from ConnectWise PSA for the agreements themselves and List Companies for client context (company name, account manager, territory). Each row shows the client, the agreement name and type, hours delivered against that agreement in the range totalled from List Time Entries, ticket volume from List Service Tickets, the effective hourly rate we are actually earning, and a flag when delivered hours have blown past what the agreement covers. Default the sort to worst effective rate first so the leaking agreements are at the top, and let me sort by hours, ticket volume, overage or client. Each row also shows its saved review state and who set it.
ConnectWise nuance to bake in: time entries and agreements relate through the company and agreement links on each time entry, so total hours from actual time entries rather than assuming ConnectWise exposes a computed agreement margin. The list endpoints use the proprietary conditions syntax with pageSize up to 1000, so page through in bulk with date conditions on the range rather than fetching client by client. Filter agreements down to active ones that overlap the selected range.
Clicking a row opens a detail page for that agreement. It shows that client's tickets for the period ranked by hours consumed, each with summary, board, status and the total time logged against it, and a breakdown of which technicians' time landed there, resolving the member on each time entry against List Members so I see real names rather than IDs. If a margin brief has already been written for this agreement and period, render it at the top of the page.
Put an "Investigate this agreement" button on the detail page that kicks off a background agent. The agent reads the client's tickets with List Service Tickets, their ticket notes with List Ticket Notes, and their time entries with List Time Entries for the selected period, then works out what is actually eating the hours: recurring issue types, one noisy site or contact, a configuration that keeps breaking, a technician sink. It writes a margin brief back into app storage keyed by agreement and period, so the detail page renders it as soon as it lands. The brief should cover where the hours went, the top root causes with the hours attributable to each, and a recommendation. Show a running state on the button while the agent works, and stamp the brief with when it was generated.
From that brief the reviewer gets three actions. "Raise reprice opportunity" uses Create Opportunity to open a sales opportunity on the client's account, prefilled with the agreement name, the delivered hours versus covered hours, and the brief's recommendation. "Open a remediation ticket" uses Create Service Ticket to file a service ticket against the recurring root cause, with the summary and description drawn from the brief, and appends the supporting detail with Add Note to Service Ticket. "Share to leadership" uses Slack Bot Send a Message to post the brief summary and the top findings to our leadership channel. Confirm each action in the app once it succeeds, and link out to the record that was created.
Cost rates must be configurable inside the app. Give me a settings area that stores a blended cost-per-hour default plus per-technician overrides in app storage, because not every ConnectWise API user has financial permissions and I do not want the app to depend on reading rates out of ConnectWise. All margin and effective-rate maths on the board and the detail page uses those stored rates, falling back to the blended default for any technician without an override.
Persist a review state per agreement with values of healthy, watch or reprice, recording who set it and when, so next month's review opens where we left off. Show the state as a chip on both the board and the detail page, let me change it inline from the board, and keep the history visible enough that I can see the state was last touched two months ago. Include a filter for review state so I can pull up just the watch and reprice list going into the meeting.
What does this prompt do?
- Lists every active agreement for a date range you pick, with the client, the hours your team actually delivered, ticket volume, and the real hourly rate you are earning on that contract.
- Flags agreements where delivered hours have run past what the contract covers, so the ones quietly losing money rise to the top of the board.
- Opens a detail page per agreement showing which tickets ate the hours and whose time landed there, plus a one-click investigation that writes a margin brief back into the app.
- Turns that brief into action: raise a reprice opportunity on the account, file a remediation ticket against the recurring root cause, or share the brief to your leadership channel in Slack.
What do I need to use this?
- A ConnectWise PSA login that can read agreements, companies, service tickets, time entries and team members.
- A Slack workspace, if you want to share briefs with your leadership channel.
- Your blended cost per hour, plus any per-technician rates you want to override it with. You type these into the app, so your ConnectWise user does not need financial permissions.
How can I customize it?
- Change the default date range, whether that is last full calendar month, last quarter, or a custom window for a deeper look back.
- Set your blended cost per hour and add per-technician overrides as pay rates and seniority change.
- Adjust the point at which delivered hours count as an overage, and pick which Slack channel briefs get shared to.
FAQs
Do I need financial permissions in ConnectWise for this to work?
Where do the delivered hours come from?
What does the Investigate button actually do?
Will my review notes still be there next month?
Can I act on a finding without leaving the app?
How many agreements can it handle?
Related templates
See how your brand's news coverage and sentiment stack up against four competitors, then let an assistant write the weekly report for you.
One screen showing every social post waiting on approval, sorted by deadline, so reviewers can approve or reject without leaving the page.
Every Monday, find the past champions and closed-won contacts who changed jobs, update Attio, and get the moves worth chasing in Slack.
Staff submit what happened, your social manager edits the copy, picks the accounts and puts it on the calendar without a single spreadsheet.
Open one board each morning, see which voice calls went badly, replay the exact moment the caller got frustrated, and file the fix.
A personal queue of every overdue Guru card, sorted by how late it is, with one-click verify, reassign, comment, and an agent that drafts the refresh for you.
Stop rebuilding agreement profitability in a spreadsheet.
Open one board each month, see which agreements are leaking margin, and act on them without leaving the page.