# A client health board for your GoHighLevel sub-accounts

> One page ranks every client sub-account by how much it slipped this period, so you know who to call today without logging into each account.

- Workflow type: app
- Services: LeadConnector, Slack Bot
- Categories: Operations, Sales
- Published: 2026-08-31

## What it does

- Puts every client sub-account in one table with new contacts, open and won deal value, and appointments booked for whatever date range you pick.
- Compares each number against the previous period and puts a red flag on any client whose new contacts or won deal value dropped past a threshold you control.
- Sorts worst decline first, and gives every client its own page with pipelines, top open deals, assigned team members, and a running log of internal notes you keep in the app.
- Adds a Write the client update button that hands the account to a background assistant, which drafts a blunt health brief, saves it to the client card, and posts it to your Slack channel.

## What you'll need

- A GoHighLevel agency account with access to the client sub-accounts you want on the board.
- Permission to read account and company level data, so the board can see every sub-account instead of just one.
- Deals tracked as opportunities inside each sub-account, since the money figures come from won deal value rather than invoices or payments.
- A Slack workspace and the channel your account managers work out of.

## Prompt

Build me an internal app for my GoHighLevel agency. I run about a dozen client sub-accounts in LeadConnector, and today I have to log into each location separately to find out which ones are slipping. I want one board that answers "who do I call today" the moment it opens. The audience is me and my account managers, never the end client, so keep the tone internal and blunt throughout.

The main view is a portfolio table with one row per sub-account, pulled from Search Locations in LeadConnector. Above the table I pick a date range, defaulting to the last 30 days, and every number is compared against the period immediately before it of the same length. For each location show: new contacts created in the range using Search Contacts (Advanced); open opportunity value and won opportunity value using Search Opportunities, with stage names resolved through Get Pipelines for that location so I know which stages count as won; and appointments booked in the range using List Calendar Events. Show each metric alongside its change versus the prior period as a percentage.

I control a decline threshold, defaulting to 20 percent. Put a red flag on any client whose new contacts or won opportunity value fell by more than that threshold versus the prior period. Sort the board by worst decline first by default, so the accounts in trouble sit at the top. Let me re-sort by any column, and keep the flagged rows visually obvious no matter how the table is sorted.

Important constraint: derive every money figure from the monetary value on won opportunities. Do not use invoices, payments, or billing anywhere in this app, and never label anything as collected revenue. This board measures the results we are producing inside each client's account, not what the client has been billed.

Clicking a client row opens a detail page for that location. Show its pipelines and stages from Get Pipelines, its top open opportunities ranked by value from Search Opportunities, and the team members assigned to that account from List Users. Repeat the headline metrics and the period comparison at the top of the page. Keep appointment detail shallow, just counts booked over the range, because I do not want this drifting into a show rate report.

Each client detail page carries a running log of internal notes. I type a note in the app, it saves with a timestamp and the name of whoever wrote it, and it persists per client so the whole team reads the same history. Store these notes in the app itself. Do not write them into the client's own GoHighLevel account, since this is internal commentary that the client should never see.

Every client row and detail page also gets a "Write the client update" button that kicks off a background agent scoped to that location. The agent pulls that location's contacts with Search Contacts (Advanced), its opportunities with Search Opportunities resolved against Get Pipelines, and its appointments with List Calendar Events, for both the selected period and the prior period. It then writes a plain English health brief covering what improved, what slipped, and three recommended actions, in the same blunt internal tone. The brief is saved back into the app so it shows on that client's card with the date it was written, and it is also posted to our account management channel using the Slack Bot Send a Message operation. Let me choose the Slack channel inside the app. Show the button in a running state while the agent works, and surface the newest brief as soon as it lands.

Practical notes for the build. Every LeadConnector read is scoped by locationId, so the board fans out one set of calls per sub-account. LeadConnector allows roughly 100 requests per 10 seconds per resource, so gather each location's rollup once and cache it rather than refetching on every render, and give me a refresh control plus a visible timestamp showing when the numbers were last pulled. List endpoints are cursor paginated through meta.startAfter and meta.startAfterId, while Search Contacts (Advanced) uses page based pagination. All requests need the Version header set to 2021-07-28. Agency level reads across sub-accounts need the locations and companies read scopes. If one location errors or times out, show that row in an error state rather than silently dropping it from the board.

## How to customize

- Change the default date range and the drop percentage that turns a client red.
- Pick which Slack channel the client updates land in, and adjust how blunt the written brief is.
- Change the default sort or the columns on the board if you would rather lead with something other than the biggest decline.

## FAQ

### Does this show how much each client actually paid us?

No. Every money figure comes from the value of won deals inside each client sub-account, not from invoices or payments. The board measures the results you are producing for the client, not what the client has been billed.

### How many client accounts can it handle?

It is built for a portfolio of roughly a dozen sub-accounts. It gathers each account's numbers once and caches them, so the board stays fast and stays inside GoHighLevel's request limits. You refresh when you want fresh numbers, and the page shows when they were last pulled.

### Can my account managers use it, or is it just for me?

Anyone you share it with can open the board, add internal notes, and kick off a client update. It is written in an internal tone for the agency side and is not meant to be shared with the end client.

### Do clients ever see the notes or the written briefs?

No. Notes stay inside the app and briefs go to your own Slack channel. Nothing is written back into the client's GoHighLevel account.

### What if a client runs several pipelines?

Open and won deal value add up across all of that client's pipelines on the board, and the client's own page breaks it down pipeline by pipeline using the stage names set up in their account.

### How far back does the comparison go?

Each number is compared against the period immediately before the one you picked, of the same length. Choosing the last 30 days compares against the 30 days before that.

Use this prompt in General Input: https://www.generalinput.com/prompts/a-client-health-board-for-your-gohighlevel-sub-accounts