Everyone renders the same GA4 charts. What separates a Fortune-100 report is four things we can actually do.
An AI narrative that explains the numbers · goals and alerts that make it accountable · true custom-domain white-label · and closing the loop all the way to leads and dollars, not stopping at sessions. Three of the four are hard for a normal agency. They’re native for us — because we host the site, own the CRM, and write the code.
“This month we generated [X] leads → [Y] became booked jobs → worth ~[$Z] → at [$CPL] each. For every $1 you spent, you got back $[ROAS].”
Why we can do this and they can’t
The unfair-advantage stack
Most agencies rent analytics from a vendor and paste client-side GA4 that ad-blockers eat. We sit one layer deeper — on the infrastructure itself. That turns enterprise measurement from a subscription into a property.
We host the edge
Almost every client is Astro on Cloudflare — we own the hosting layer. That means first-party, server-side, cookieless measurement that ad-blockers and GA4 thresholding can’t eat. Enterprise-grade accuracy by default, not as an upsell.
13 of 17 clients on Cloudflare WorkersWe own the CRM
GoHighLevel already stores first-touch AND last-touch attribution on every contact, carries revenue up the pipeline via contactId, and does native call-tracking. We don’t build attribution — we inherit it, then join it to the edge data.
Live MCP: contacts, opportunities, paymentsWe run the cron
The Site Health engine (CLI-132) already pulls Lighthouse + axe on 13 sites nightly from an M3 + Cloudflare cron. The reporting pipeline is an extension of a muscle we already have, not a new machine.
Daily fleet job, dashboard shippedWe control the code
We author every Astro base layout. Dropping a first-party beacon, injecting hidden attribution fields into GHL forms, tagging conversions — all one-line changes we make at build time. No client IT tickets, no plugin roulette.
Base-layout edit ships to all sitesSpeak the owner’s language, not the analyst’s
What we report — money first, by business type
Our owners aren’t marketers. They ask “did the phone ring, and did it turn into money?” — not “what’s my bounce rate?” So the template is segmented: the hero metrics change with the kind of business, but every one survives the filter “so what does this mean for revenue?”
- Leads (calls + forms, deduped)
- Cost per booked job — the north star
- Booking rate (target >60%)
- Revenue per lead + ROAS
- Lead source attribution
- GBP calls + direction requests
- Map-pack visibility (top-3?)
- Review rating + velocity
- Website clicks from GBP
- Bookings / messages
- Sessions → conversion rate
- Average order value
- Revenue + ROAS
- Top products / channels
- Local GBP snapshot
The master menu the system can compute
Canonical metric taxonomy
★ = anchors the executive view. Everything else is available on drill-down or in the appendix for the owner who wants to dig. Grouped along the funnel, with the source we pull each from.
| ★ Leads / conversions | The one number that = new business | Edge events · GHL · call tracking |
| ★ Cost per lead / per booked job | What each new customer costs | Ad spend ÷ conversions |
| ★ Revenue / pipeline value | ROI justification for the retainer | GHL opportunities + payments |
| ★ ROAS / ROI | Did the marketing pay for itself | Spend + attributed revenue |
| Goal progress (on-track / at-risk) | Accountability against agreed targets | Goals engine |
| Sessions · new vs returning | How many showed up, reach vs loyalty | Cloudflare edge / Umami |
| Traffic by channel & campaign | Which channel is working | Edge events + UTM |
| Engagement rate · time on page | Quality of traffic, not just volume | Edge events / Umami |
| Top landing pages / content | What’s pulling weight | Edge + GSC |
| Geography vs service area | Are we reaching the right market | request.cf geo / GBP |
| ★ Conversion rate | Efficiency of turning traffic into leads | Edge events / GHL |
| ★ Phone calls / click-to-call | Primary lead channel for local service | Call tracking · GBP |
| ★ Form submissions | Direct lead capture | GHL forms |
| Lead → customer (qualified / booked) | Lead *quality*, not just count | GHL pipeline stage |
| Funnel steps (view → call / checkout) | Where leads leak | Edge events |
| Keyword rankings + movement | Am I showing up for what matters | GSC · rank tracker |
| Impressions · clicks · CTR · position | Visibility + how compelling the listing is | Google Search Console |
| Branded vs non-branded queries | Growing demand vs harvesting existing | GSC |
| Core Web Vitals / page speed | Google ranking + UX | Site Health engine (live) |
| Site audit health score | Is the foundation sound | Site Health engine (live) |
| ★ GBP calls + direction requests | Highest-intent, ready-to-buy signals | GBP Performance API |
| Profile views (Maps vs Search) | Local visibility | GBP |
| Direct vs discovery searches | Brand-known vs newly-found customers | GBP |
| ★ Review rating + velocity | Reputation = conversion driver | GBP / reviews |
| Map-pack position | Do they own the local grid | Local rank tracker |
| Revenue by source (first & last touch) | Fair credit across the journey | GHL attribution + edge join |
| CAC · LTV · LTV:CAC | Long-term profitability | Spend + GHL revenue |
| Pipeline / deal-stage value | Future revenue visibility | GHL opportunities |
| Repeat / returning-customer rate | Retention economics | GHL contacts |
| Benchmark vs trade | Am I winning vs my industry | WebFX / LocaliQ / WordStream |
The follow-up · our second unfair advantage
What GoHighLevel gives us that no one else has
Owning the edge answers “who came and from where.” Owning GHL answers “did it turn into money” — and GHL already does the expensive part. We don’t build attribution or call tracking; we inherit them and join them to the edge data. This is the difference between a traffic report and a revenue report.
Native first + last-touch attribution
Every GHL contact already carries First Attribution (static) and Latest Attribution (updating) — source, medium, campaign, referrer, landing page. We don’t build the multi-touch split every vendor charges for; we read it off the record and group revenue by it.
The revenue chain by contactId
Contact → Opportunity (monetaryValue, status=won) → Payment (collected revenue) all join on contactId. A won opportunity inherits the contact’s attribution by transitivity. That’s how a website visit becomes an attributable dollar — the chain already exists inside GHL.
Native call tracking (no CallRail tax)
GHL’s own number pools do dynamic number insertion (min 4 numbers). The tracking number dialed maps to the session; the caller’s phone number is the deterministic join key to the contact. For phone-first trades we can attribute calls without paying for a separate CallRail seat per client.
Payments & pipeline as truth source
list-transactions + opportunity pipeline give us booked and collected revenue directly — not an estimate. That turns "traffic up 18%" into "18% more traffic drove $4,200 in booked jobs." The ROI line owners actually care about.
Reputation + conversations in-platform
GHL manages reviews, SMS/email conversations, and appointment calendars. Review velocity, response rate, and booked-appointment counts come straight from the CRM we already run — no third-party reputation tool.
Live MCP — already connected
ghl-tcym and ghl-two-chicks MCP servers are live in Aria’s session today (contacts, opportunities, conversations, payments, social stats). The reporting pipeline can pull real numbers now; scaling to all clients is a per-location OAuth, not new infrastructure.
Visit → dollars, deterministically
The attribution chain
Plant one join key at the top (a first-party _vid) and let GHL’s native fields carry the rest.
Phone calls join on the caller’s number; revenue rides up the pipeline on contactId. That’s
enterprise attribution — actual dollars traced back to a campaign or a session.
_vid on our page and inject them as hidden fields into the embedded GHL form — is a
one-time base-layout change. Non-negotiable, and only we can make it because we write the layout.
Server-side first, because we can be
The data-capture architecture
Four layers. The edge Worker is the spine (more accurate than GA4, ad-block-proof, ITP-durable); Umami gives clients a polished cookieless UI cheaply; the nightly cron pulls platform + SEO + local; GA4 is demoted to Google-Ads plumbing. Recurring cost for the whole layer at ~15 sites: ~$5–25/mo.
Edge collection Worker — the spine
Cloudflare Workers + Analytics EngineA tiny same-origin beacon (client.com/api/e — never a path with “track”/“analytics”) POSTs pageview + conversion events to a Worker. It mints an HMAC-signed HttpOnly visitor cookie (ITP-durable up to 400 days, exempt from Safari’s 7-day JS-cookie cap), enriches from request.cf (country, city, colo, ASN — spoof-proof, free), and writes to Analytics Engine. On conversions it fans server-to-server to GHL. Recovers 15–30% of the conversion data GA4 never sees.
Client dashboard tool — cookieless
Self-hosted Umami (~$5/mo, one VPS)MIT-licensed, cookieless by default (no consent banner), unlimited sites, script proxied through our own Worker for ad-block resistance. Gives clients a polished traffic/funnel UI without hand-building charts. PostHog Cloud layered on only the 1–3 clients who need session replay.
Platform + SEO telemetry — no site code
Nightly cron (extend Site Health)Pulls Cloudflare GraphQL Analytics (traffic/WAF/cache), Google Search Console (queries/rankings, bulk-export to beat the 50K-row cap), and GBP Performance API (calls, directions, views). Warehouse everything — retention walls are hard: Analytics Engine 90d, GSC 16mo, GBP 18mo.
GA4 — demoted to Google-Ads plumbing
Fired server-side via the WorkerKept only for Google Ads conversion import (Smart Bidding), audience export, and the name on the report cover. NOT the source of truth — GA4 misses 25–40% of traffic and silently drops small-business rows below ~50 users (thresholding hits our clients hardest). Our first-party edge data leads every report; GA4 rides along.
One data layer, three surfaces
How it reaches people
Build the deterministic metrics once; the portal tile, the emailed PDF, the AI sentence, and the alert are all downstream consumers. The merchant gets a live portal and a monthly ritual; you get a cockpit over the whole book.
Merchant portal
portal.madebyaspire.com — branded, always-on The client- Lands on a live Overview: 4–6 hero KPI tiles (big number + PoP % + ▲/▼ + color), then per-channel sections (tiles → chart → table).
- Custom subdomain, Aspire branding, zero vendor URL — true white-label (the thing Looker Studio literally cannot do).
- Section order tuned per client: phone-first trades lead with calls; destination businesses lead with GBP.
- Mobile-first single column — the owner checks it on a phone.
Monthly report
White-label PDF + live link, from our domain The ritual- The interpretation layer the dashboard can’t give: narrative, context, recommendations.
- 3-sentence TLDR at the top for mobile, executive summary readable in ~90 seconds, detail in an appendix. Under ~10 pages.
- Cadence: monthly for SEO/local; weekly for paid-media clients; weekly for the first 60–90 days of any new client, then step down.
- Pairs with an optional 15-min walkthrough — turns a report into a conversation.
Owner cockpit
Your cross-client view — never client-visible You (+ Jaime)- Every client is a card/row with 3–5 of their own KPIs (number + PoP % + green/red), filterable by tag and by who owns the account.
- KPIs ↔ Goals toggle; optional roll-up table with an aggregate total across the book.
- Surfaces cross-client risk at a glance: whose leads dropped, whose ROAS slipped, who’s off-goal.
- Walled off from clients entirely — the same pattern Databox and AgencyAnalytics enforce.
What makes it read enterprise
The intelligence layer
AI narrative — phrasing layer, not reasoning layer
The pipeline computes the load-bearing facts deterministically (deltas, MoM/YoY %, top-contributing dimension). The LLM only phrases them: “Leads up 22% MoM, driven by organic search.” It never does arithmetic or invents causes. Human edits before it ships; a template fallback degrades gracefully. This is the marquee differentiator across every premium tool — and it’s cheap for us because we already run Claude.
Proactive alerting — push, not pull
Flag conversion-rate drops, lead-volume drops, ad-spend spikes, off-goal pacing — always pairing a volume metric with a quality one (a spike of unqualified leads is not a win). Threshold rules for known limits + anomaly detection for the unexpected. Anti-fatigue: severity tiers, persistence windows, mute during planned changes. Surfaced to the owner cockpit and to Aria’s morning brief.
Enterprise trust signals
“Data last updated” stamp on every view · per-section source labels (GA4 / GBP / GHL) · metric definitions on hover · caveat notes (“excludes internal traffic”) · drill-through to raw rows · a section flags itself stale rather than showing bad numbers. These are what make a report read Fortune-100 instead of hobby-dashboard.
Who builds what
Execution — roles & ownership
Most of this runs without you. Aria orchestrates and owns the data pipeline; Vegas owns everything client-facing and site code; Circa owns the GHL side; Strat wires the SEO/local feeds. Your five tasks are the human-gated decisions and access that unblock the rest — isolated at the bottom so nothing gets lost.
Edge collection Worker · deterministic metrics engine · nightly telemetry cron (extends Site Health) · owner cockpit on CC · the hand-built pilot report. Briefs and verifies the specialists. Closes the loop between edge data and GHL.
Site-side instrumentation (beacon in the Astro base layout + hidden _vid/UTM fields into the forms) · the white-label merchant portal (portal.madebyaspire.com) · the PDF / email report renderer. Web craft is Vegas’s lane; Aria briefs, Vegas builds.
Call-tracking number pool · the conversion webhook (Worker → GHL) · verifying First/Latest attribution + payments/pipeline data is clean · defining the GHL-side “won” event. Circa owns GHL configuration.
Google Search Console rankings/impressions feed and the GBP local-performance feed. Minimal in Phase 0; wires in when the nightly telemetry cron lands.
The money-event definition, ad UTM tagging authorization, Google/GBP API access, infra sign-off, and the pilot-report review. These unblock the build — see “Your tasks” below. Everything else runs without you.
The phase timeline
Prove the whole chain on one client first, then productize. Each phase ships something real. Total to a full-book rollout: roughly 8–11 weeks of specialist build time, sequenced behind the AD-first gate.
Pilot on That Call You Missed
GREENLIT. TCYM is the ideal proving ground — live, ghl-tcym MCP already connected, and we’re spending on Meta ads right now, so there’s real paid traffic and real ad dollars to attribute against. Instrument the edge beacon, wire the hidden _vid + UTM fields into the demo/signup forms, stand up Umami, and hand-build one monthly report end-to-end. Proves the whole chain ad-spend → visit → call/demo → signup → dollars before we scale. Full task board below.
Deliverable: one real ROAS report + a live portal view for TCYM.The data spine
Productize Phase 0: the collection Worker as a drop-in for the Astro base layout, the nightly telemetry cron (CF GraphQL + GSC + GBP) folded into the Site Health job, and the warehouse that beats the retention walls. Clear the GBP Basic-Access quota gate now — it blocks local data at launch.
Deliverable: every Cloudflare-hosted client emitting first-party data.The deterministic metrics engine
One computed fact-set (deltas, PoP %, top-driver, goal + threshold evaluation) that feeds the portal tile, the PDF, the AI sentence, and the alert. Build it once; everything downstream consumes it. This is the leverage point the whole product pivots on.
Deliverable: metrics API returning per-client scorecards.Merchant portal + report renderer
Vegas builds the white-label portal (portal.madebyaspire.com) and the PDF/email renderer against the metrics engine. Brand it to the live v2.9 design library. AI-narrative + alerting wired in.
Deliverable: self-serve portal + scheduled monthly send.Owner cockpit + rollout
Cross-client cockpit on CC for you and Jaime. Roll the instrumentation across the remaining clients, tune alert thresholds, and set per-client cadence. Fold the health of the pipeline into the weekly self-audit.
Deliverable: whole book reporting; cockpit live; alerts tuned.Greenlit · starting now
Phase 0 task board — the TCYM pilot
The exact sequence for the pilot on That Call You Missed, in dependency order. Each task has one owner. Steps 3–6 run largely in parallel once you’ve answered steps 1–2.
Which URL do the Meta ads point to (that’s what we instrument)? What counts as a conversion for TCYM — a booked demo, a signup ($1,995+$399/mo), or a call to Grace? What’s a “good month” target number? ~15 min; unblocks everything.
Every live ad needs utm_source / utm_medium / utm_campaign. Without it, paid attribution starts blind. You authorize; Circa (or Aria) applies it in Meta Ads Manager. Do this first — it also improves the ads immediately.
One small VPS (or M3) for cookieless Umami, proxied through our Worker. Deploy the collection Worker that mints the _vid cookie, enriches from request.cf, and writes to Analytics Engine.
Drop the beacon into the TCYM Astro base layout; inject hidden _vid + UTM fields into the demo/signup forms (the domain-scoped-cookie fix). Aria briefs with the exact snippet contract.
Set up the call-tracking number pool on the TCYM number; stand up the conversion webhook (Worker → GHL); verify First/Latest attribution + payment fields populate on a test lead end-to-end.
Join the edge data with the ghl-tcym MCP pull (contacts, opportunities, payments), compute the scorecard, and hand-build the first monthly ROAS report + a live portal view for TCYM.
You look at the real report on real TCYM data and tell me what’s missing or wrong. Sign-off turns the pilot into the product — Phase 1 productizes exactly what you approved.
Your tasks, Topher
Five items. The first two unblock everything — the rest can trail by a few days.
The economics
What it costs, what it’s worth
Sources: AgencyAnalytics · Databox · HubSpot · Semrush · Whatagraph · Cloudflare Workers/Analytics Engine docs · GHL API v2 · WebFX / LocaliQ / WordStream 2026 benchmarks. Full citation set in the session journal.