GoHighLevel rebuild and a live KPI dashboard
Prepared for Ryan Hagan, Jack Ryan Group. A fixed scope, a fixed price, and a clear line between what I build and what has to come from your side.
Prepared for Ryan Hagan, Jack Ryan Group. A fixed scope, a fixed price, and a clear line between what I build and what has to come from your side.
Rolling 30 days, every active client, plus a roll-up across the whole book. It refreshes on a schedule and lives inside GoHighLevel, not behind a second login.
This is built on the SimpleTalk pipeline already running for the monthly client recaps. The authentication, the per sub-client scoping, and the metrics pull for all 29 accounts are working today. That is why three weeks is a real number and not an optimistic one.
Logs in, scopes to each sub-client in turn, pulls the daily rollup for the trailing 30 days.
Written to a running store so the window can move and history is kept for audit.
Call transcripts scored for hands raised, tire kickers, and unusable numbers.
Rendered as a page and embedded in the GoHighLevel sidebar as a menu item.
This is not a mockup. Every figure below came out of the pipeline, off one of your sub-accounts, from the April data. This is the monthly recap that goes out to each of your agents.
The SimpleTalk access token expires every 24 hours, so a scheduled job cannot rely on a person to hand it a fresh one. The pull authenticates itself against the parent account, which is already in place. The dashboard refreshes whether or not anybody is at a desk.
You asked for twelve. Nine of them are measurable from data that exists today. Here is exactly where each one comes from.
| KPI | Source |
|---|---|
| Human time saved | Dials multiplied by the 144 second per-dial baseline |
| Human payroll saved | Hours saved multiplied by a real estate assistant hourly rate |
| Appointments booked | total_appointments_booked |
| Successful agent transfers | total_transfers |
| Bad numbers removed | call_did_not_connect |
| Hands raised | Transcript classifier, definition set with you in week one |
| Tire kickers removed | Transcript classifier, definition set with you in week one |
| Booking rate | Appointments divided by answered calls |
| AI callbacks pending | Transcript classifier: a callback promised, no later call to that number |
Human payroll saved is hours multiplied by what a real estate assistant costs per hour. Human time saved rests on a 144 second per-dial assumption. Both are reasonable and both are assumptions, so the dashboard prints the assumption next to the number. Your clients see how the figure was built, which is what keeps it credible when one of them asks.
These three count records that data enrichment appends to a contact. Nothing appends data today, so there is nothing to count yet. Enrichment is covered in section 06 and quoted separately.
This is buildable. It needs a property data source behind it, scoring each contact on the signals that actually predict a move, and that source is the same class of vendor that powers the other three tiles.
It sits with enrichment in section 06 rather than in the three week build, so the scoring model gets built against a data source you have chosen and tested rather than one picked in a hurry.
Built from your reordered notes. Applied at agency level so every sub-account inherits it.
GoHighLevel supports part of this natively and none of the rest. Adding menu links is a real feature and it is stable. Launchpad has an off switch. Several top level items can be gated through the SaaS Configurator.
The renames, and the removal of sub-items like Snippets, Companies, Blogs, and Agent Report, have no native controls at all. They are done with custom styling applied at agency level, which targets GoHighLevel's own interface. GoHighLevel updates that interface regularly and without notice. A change on their side can make a hidden item reappear or a renamed item revert to its old name.
The rebuild is delivered and verified working. Drift caused by GoHighLevel platform updates is covered at no charge for 30 days after delivery. After that it is a support item. I would rather say this now than argue about it in month two.
Your question was whether a sale price sits on each contact with commission attached, or whether it is applied across the board. Neither one works, and it is worth being straight about why.
The AI is dialing cold leads. What the system knows about a given contact is a phone number and what happened on the call. It does not know which property that person owns, what it is worth, or whether they own one at all.
So any dollar figure attached to an individual contact would be a number I made up and put a decimal point on.
Falling back to a market average does not rescue it either. A single ZIP code holds a ten million dollar house and a hundred thousand dollar house. An average across that range describes neither of them, and applying it per contact produces a pipeline number that looks precise and means nothing.
The same honesty applies to projections. Multiplying appointments by a close rate the agent estimates about themselves is still an invented number, because these agents have no measured close rate on AI-booked appointments yet. So the dashboard draws a hard line: it shows dollars only where a dollar actually exists in GoHighLevel.
Straight from the daily rollup. This is a counted number, not an estimate. It stands on its own as the result of the calling operation.
When an agent puts a real number on an opportunity, the dashboard reads it and sums it by stage. Entered by a person who knows the deal, not derived by software.
Once appointments have lived a full cycle in the pipeline, closed over booked becomes a real measured rate, per agent. It appears when the data has earned it, not before.
If your agents already type deal values into GoHighLevel opportunities today, the pipeline view lights up in week one and nothing extra gets built. If they do not, the dashboard shows the appointment count alone until values start getting entered. No tile ever shows a dollar figure the system cannot point to.
Three items. None of them require going agent by agent, which is deliberate.
| Needed | If it does not arrive |
|---|---|
| GoHighLevel agency access across all sub-accounts | Nothing multi-client can be built. This is the one hard blocker. |
| Hourly rate for the payroll figure | That tile ships hidden and switches on later. |
| Definitions for hands raised and tire kickers | Those two tiles ship hidden. Nothing else is affected. |
Anything that arrives late ships in the reduced form above rather than pushing the date. Late input costs a tile, not a week.
Property search inside GoHighLevel, with prospect activity and trigger actions, depends on a working IDX feed per client, supplied ready to use. That is your side of the line.
MLS access is granted per broker, per MLS, on signed paperwork, and approval commonly runs 3 to 10 business days per request. Across a book of agents that is a separate approval for each one, each waiting on a different broker's signature. No amount of engineering time compresses that, and no vendor can do it on your behalf.
Ask your IDX provider whether their GoHighLevel product already pushes prospect search activity into GoHighLevel as contact events. If it does, this becomes setup rather than development, and it gets cheaper for you.
Four of your KPIs depend on appending data that is not in your system today. Before anyone builds against a vendor, here is what testing actually returned.
| What you wanted | What came back |
|---|---|
| Correct person | Confidence scored 9 out of 10, and it matched the wrong person |
| Email address | Every email field empty |
| Home address | City and state. No street, no ZIP |
| Phone number | One returned, area code from a different state than the record |
The record was rich in employer, job title, work history, and social profiles. That tells you what the product actually is.
A professional profile appender. Used before a call, it can tell an agent where someone works, what they do, how long they have been there, and where to find them socially. An agent who knows the person they are calling manages a warehouse team and has been there nine years has a better conversation than one who knows nothing. That is real, and it is worth something.
It is not a skip trace. It did not produce a mailing address or a verified cell phone in testing. Those come from a different class of vendor, built on property and public records rather than professional profiles.
If what you want is verified mobile numbers and mailing addresses, that is a skip trace vendor rather than a profile vendor. Different data, different source, and a different billing model.
Skip trace vendors charge for every record they look up, whether or not the lookup returns anything useful. Run it across a full contact database and the cost tracks the size of that database, not the number of deals that come out of it. On a book your size, that can turn into a meaningful monthly line very quickly.
It only stays sensible if the spend is incremental. That means two things. Enrichment fires on a trigger, when a contact actually reaches a stage where the extra data changes what happens next, rather than sweeping every record on a schedule. And the cost is passed through per client, so an agent who wants enriched contacts is the one paying for their own lookups.
Structured that way it scales with usage and stays defensible. Structured as a flat monthly commitment across everyone, it becomes a bill you are absorbing on behalf of clients who may not be using it.
Whichever vendor you pick, the account is opened by Jack Ryan A.I. and billed directly to you. Nothing runs through me and nothing carries a markup, so you see the true per-record cost, you can throttle or stop it the same day, and the spend is visible in real time rather than arriving on an invoice a month later.
A paid bake-off before anyone commits. 100 real contacts from your own GoHighLevel, run through two vendors, scored on match accuracy and on how many usable phone numbers and addresses actually come back. You get a real hit rate and a real cost per usable record, then you decide.
That is quoted as a fixed fee. The enrichment build itself gets quoted after it, once there is a vendor worth building against.
No enriched field writes to a contact record without a confirmation step. A confident wrong match is worse than no match at all, and the test produced exactly that at 9 out of 10 confidence.
Age, sex, and family status fields are never used for targeting. Enrichment vendors return them. Housing advertising is governed by the Fair Housing Act, and targeting housing marketing on those attributes is the specific conduct that has drawn federal enforcement against major advertising platforms. Those fields stay out of any audience or filter built here.
The clearest way to avoid an argument later is to write down now what this does not cover.
Scheduled pull running unattended, callback field probed, classifier definitions agreed with you.
Dashboard views, the GoHighLevel rebuild, the pipeline view from GoHighLevel deal values.
Client tools, embedding, testing, documentation, handover.
Payment is 50% at signing and 50% on delivery, both tied to the calendar.
Several inputs sit outside both of our hands, including MLS approvals that run on their own clock. Tying the second payment to those would mean the build gets held up by a clerk neither of us has met. What ships on delivery is defined by what arrived by the dates in section 05, and that table gets agreed before work starts.
Handover includes the running system, the source, and written operating documentation.
Signing here starts the clock. Work begins August 8 and delivery is three weeks from that date.
Got it. You will have a confirmation reply shortly with a copy for your records. I start August 8.