ConnectWise PSA agreement margin board for monthly reviews

By General Input

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.

Integrations

  • ConnectWise PSA (Manage)
  • Slack Bot

Type

App

Categories

  • Finance
  • Operations

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.

Related prompts

Explore more prompts
A brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsClean out the Looker dashboards and Looks nobody opensLiveKit live operations console for room moderationWake up dormant Keap leads with a researched reasonLiveChat coverage board for planning next week's shiftsPhone routing control panel for LiveKit voice agentsLinkedIn Ads budget pacing dashboard for every client accountGive your team Looker numbers without buying more seatsPause marketing emails to escalated customers, then restore them