How AGM Pro Tools unified three disconnected systems into a single live dashboard — in one session.
Heavenly Greens is a Northern California artificial turf installer serving the Bay Area through a Costco partnership program. Leads flow in through CENTAH (Costco's call center), appointments are set and run by a dedicated sales rep, and jobs are managed across multiple platforms.
Salesforce — CRM, lead tracking, opportunity stages, appointment scheduling
AGM (GoHighLevel) — Pipeline management, contact records, custom fields, workflow automation
CENTAH / M365 — Costco lead intake emails, call center notes
Zapier — 42 automations gluing the systems together (previously; 4 replaced, 38 pending)
A question any contractor should be able to answer in seconds. For Heavenly Greens, it required stitching together data from three separate systems — and the answer was still wrong.
The Costco pipeline dashboard hadn't refreshed in over 24 hours. No automated refresh existed — data only updated when someone manually ran a script.
Dashboard showed 16 sales. The actual number was 18. Two sales were invisible because AGM's pipeline stage names didn't match the dashboard's lookup table.
The Shaw Turf Products breakdown — which products were sold, how much square footage, at what revenue — was completely empty. Wrong custom field ID in the API query.
Appointments "set this week" showed 1. The real number was 8. Appointments "ran this month" showed 3. The real number was 30. The dashboard was counting by lead creation date, not actual appointment date.
Every data point on the dashboard required reconciling information from multiple sources. Each source used different field names, different stage names, and different date conventions.
| Data Point | Salesforce Says | AGM Says | Dashboard Showed |
|---|---|---|---|
| Matthew Degroot's status | "1st Presentation Set" | "Proposal/Contract Approved" | "Appointment Booked" (wrong) |
| Pipeline stage name | N/A | "Proposal/Contract Approved" | Not recognized (expected "Contract Approved") |
| Shaw Products field | N/A | Field ID: AytQaekFFJOfbIZQRS2a | Querying wrong ID (bMsGjVxsVlc05ZCekUyJ) |
| Appointment dates | Next_Appointment_Date__c | Not tracked | Using lead CreatedDate instead |
| "Appointments ran" | 30 past appointment dates | Only 4 at post-appointment stages | 3 (using AGM stage, not SF date) |
No automated refresh existed. The generation script ran locally, required manual execution, and wrote to a static JSON file on GitHub Pages.
Moved data generation to a cloud function (Modal) running every 5 minutes. Dashboard now fetches live from the API endpoint. Fallback to static JSON if the endpoint is down.
AGM pipeline stages use names like "Proposal/Contract Approved" and "Total Collected (Paid in Full)" — the dashboard only recognized "Contract Approved" and "Paid in Full." Two sales invisible.
Pulled the actual pipeline stage names from the AGM API and mapped every one. Dashboard picks the more progressed status between SF and AGM. Matthew Degroot's $4,700 sale immediately appeared.
The API query was using the wrong custom field ID. "Costco - Shaw Turf Products" lives at field AytQaekFFJOfbIZQRS2a — the code was querying a non-existent field.
Fixed the Shaw Products field ID. Added live AGM API calls as fallback when local cache files don't exist (cloud environment). Product breakdown restored: Foundations Freedom, K9 Park, etc.
"Appointments set this week: 1" — actual: 8. "Appointments ran this month: 3" — actual: 30. The dashboard was using lead creation date, not the actual appointment date from Salesforce.
Added Next_Appointment_Date__c from Salesforce opportunities. New dashboard rows: Appointments Set Today/This Week/This Month + Appointments Ran This Month. Numbers now match Anthony's actual schedule.
| Metric | Before | After |
|---|---|---|
| Data freshness | 24+ hours stale (manual refresh) | 5-minute auto-refresh (live API) |
| Sales tracked | 16 (missed 2 sales) | 18 (all accounted for) |
| Revenue visible | $149,029 | $154,353 |
| Shaw product breakdown | Empty (wrong field ID) | Foundations Freedom: 4 jobs, K9 Park: 1 job |
| Appts set this week | 1 (using wrong date field) | 8 (real SF appointment dates) |
| Appts ran this month | 3 (required stage change) | 30 (past appointment date = ran) |
| Lead list order | Unsorted | Alphabetical by last name |
| Lead activity tracking | None | Today / This Week / This Month |
You can't manage what you can't measure. If your dashboard says 3 appointments ran this month when the real number is 30, every decision you make about sales staffing, marketing spend, and revenue forecasting is wrong.
Anthony ran 30 appointments this month. The dashboard said 3. That's not just a data bug — it's a morale problem. Your best performer's work was invisible.
When you're sitting across from a Costco member showing them your pipeline and the numbers are wrong, you lose credibility. Real-time data isn't a feature — it's table stakes.
Three systems that don't talk to each other means three sources of truth — which means zero sources of truth. Every manual reconciliation is time spent not selling, not installing, not growing.
Heavenly Greens isn't unusual. Every contractor running Salesforce, ServiceTitan, Jobber, Housecall Pro, or Field Routes alongside a CRM has this exact problem: systems that don't agree on basic facts.
AGM Pro Tools doesn't just connect your systems — it reconciles them. It understands that "Proposal/Contract Approved" in AGM means the same thing as "Sales Closed Won" in Salesforce. It knows that an appointment date in the past means the appointment happened, even if nobody updated the stage.
The result: one dashboard you can trust. Real numbers. Real-time. Ready for the client conversation.
Tell us about your business and we'll show you where the gaps are.
Book a Free Strategy Call