A client health board for your GoHighLevel sub-accounts

By General Input

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.

Integrations

  • LeadConnector
  • Slack Bot

Type

App

Categories

  • Operations
  • Sales

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.

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