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.

App
ConnectWise PSA (Manage)Slack BotFinanceOperationsAI ReportsResearch & Monitoring
PromptCreate

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?
No. Cost rates live inside the app. You enter a blended cost per hour and optional per-technician overrides, and the app does the margin maths itself from delivered hours. Your ConnectWise user only needs read access to agreements, companies, tickets, time entries and members.
Where do the delivered hours come from?
From the actual time entries logged against each client and agreement in the period you pick, rather than a precomputed figure. Ticket volume comes from the service tickets in the same window, so the two numbers always describe the same date range.
What does the Investigate button actually do?
It kicks off a background agent that reads the client's tickets, ticket notes and time entries for the period and writes a short brief explaining what is eating the hours: a recurring issue type, one noisy site or contact, a piece of kit that keeps breaking. The brief is saved in the app and appears on that agreement's page.
Will my review notes still be there next month?
Yes. Each agreement carries a review state of healthy, watch or reprice, along with who set it and when, so next month's review opens exactly where you left off instead of starting from a blank sheet.
Can I act on a finding without leaving the app?
Yes. From a brief you can open a sales opportunity on the account to start the reprice conversation, file a service ticket against the recurring root cause, or post the brief to a Slack channel for your leadership team.
How many agreements can it handle?
It is built for portfolio-wide review, so it pulls agreements, tickets and time entries in bulk rather than one client at a time. Larger date ranges take longer to load because there is more time to total up.

Related templates

Share of voice dashboard for your brand and competitors

See how your brand's news coverage and sentiment stack up against four competitors, then let an assistant write the weekly report for you.

GDELT
Notion
Slack Bot
App
Approval war room for every social post awaiting sign-off

One screen showing every social post waiting on approval, sorted by deadline, so reviewers can approve or reject without leaving the page.

Hootsuite
Slack Bot
App
Turn champion job changes into new pipeline in Attio

Every Monday, find the past champions and closed-won contacts who changed jobs, update Attio, and get the moves worth chasing in Slack.

Boomerang
Attio
Slack Bot
Agentic Task
Collect social post requests and schedule them in Hootsuite

Staff submit what happened, your social manager edits the copy, picks the accounts and puts it on the calendar without a single spreadsheet.

Hootsuite
Slack Bot
General Input Database
App
Voice agent QA review board for your Hume EVI calls

Open one board each morning, see which voice calls went badly, replay the exact moment the caller got frustrated, and file the fix.

Hume
Linear
Slack Bot
App
Clear your Guru verification backlog in one weekly app

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.

Guru
Slack Bot
App

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.