A law firm’s GA4 reported 1,807 conversions in a month. The real number of people asking for legal help was around 347, and most of those couldn’t be tied to any marketing source. The other 1,460 “conversions” were giveaway entries.
That account isn’t an outlier. It’s the normal condition of GA4 in local service businesses, and it’s the problem we’re building this system to solve. The GA4 Website MAA is our weekly website lead report, built on Dennis Yu’s MAA discipline: Metrics, then Analysis, then Action, in that order. An AI agent runs the analysis. A human reviews every report before a client sees one, and that review still catches real mistakes.
This page is the working SOP as it stands today, published while it’s still under construction. We’re building in public, so the failures that shaped each rule are documented next to the rule. At the bottom you’ll find the QA checklist every report must pass and a skill file your own AI agent can parse. Both will keep changing.
“Prescription before diagnosis is malpractice. If you see a marketer making recommendations not based on your data, run.” — Dennis Yu
Where this stands today
- Working: the analysis method (pre-flight, lead reconstruction, the data-trust checks), the report format, and the per-client memory. About a dozen live runs on real accounts so far.
- Working, but new: the quality checks. In blind tests, independent graders scored the agent’s reports B, B+, and C- while the agent graded itself A- every time. More on that below.
- Not there yet: fully autonomous weekly runs (a human still triggers and reviews everything), the companion report for organic search terms, and lead definitions that don’t need a person to confirm them.
If you’re reading this months from now, assume the details have moved.
Why the analysis is investigative first
GA4 isn’t a ledger. It’s open instrumentation that every business wires up differently, and anything can write to it: bots, spam form-fills from overseas, booking software that overwrites the real traffic source, giveaway campaigns that inflate “conversions” by 20x. A reporter reads the dashboard and repeats it. An investigator establishes what’s true first.
So before any claim about what’s working, the report answers three questions: is this the right property, are these leads real, and can they be tied to a source? Only then does it judge the marketing.
One boundary throughout: GA4 measures lead generation. Calls, form fills, bookings. It does not measure booked jobs or revenue, and we never pretend otherwise.
The pipeline at a glance
Client memory → pre-flight → standard data pull → lead reconstruction → data trust checks → Winners & Opportunities report → quality checks → memory update
Every client has a running file with the live property ID, the confirmed lead definition, known tracking issues, and last week’s open questions. The agent reads it before touching data and updates it after, so week two builds on week one instead of starting over.
Pre-flight: is this even the right property?
Agencies migrate GA4 properties and leave ghosts behind. One dumpster rental client handed us a property that had flatlined to zero months earlier; the live data sat in a different account entirely. Run the report on the ghost and you’d tell a healthy business it was dying.
So nothing runs until the property proves it’s alive. Dead property with a live same-brand sibling: switch and note both. Two live regional properties: ask which one is in scope (a case we didn’t handle until a test run hit it). No accessible property at all: stop and ask which problem it is, access that wasn’t shared or GA4 that was never installed. Fabricating an analysis of a dead account is the one thing this report must never do.
The standard pull: same evidence, every week
The agent runs the same eight queries every time: full event inventory, channel mix, source detail, lead events by source, landing and lead pages, geography of leads, a 13-week trend, and new-versus-returning visitors. Both comparison windows, never including today, because today’s data is always incomplete.
We didn’t start here. The first version told the agent to follow the data and branch on what it found, and that produced a different investigation every run. Fixing the query set fixed most of the inconsistency.
Lead reconstruction: never trust the conversion flag
GA4’s own conversion count is a claim, not a fact. The agent pulls the full event list and sorts every event into one of three tiers:
- Case leads. Calls, contact and quote forms, bookings, qualified chat. The number that matters.
- List-building. Giveaway entries, newsletter signups, chat opens. Reported separately, never mixed in.
- Micro events. Scrolls, video plays, form-field clicks. Never leads.
Then it checks its count against GA4’s and reports the gap. A painting company’s GA4 showed 19 leads; reconstruction found roughly 92, before removing the fake ones, because the number one “lead city” was Tehran. The law firm ran the other direction: 1,807 claimed, ~347 real. Under-counting and over-counting are both routine, and both change what the owner should do next.
The lead definition gets confirmed with a human once, then recorded. The agent proposes; the human decides. When nobody’s available, the run proceeds on the proposed definition, and every number downstream carries a “pending confirmation” note until a person signs off.
The data trust checks
Nine checks with written thresholds run every week: direct-traffic share, suspicious traffic surges, unassigned sessions, broken campaign tags, lead attribution, clean-versus-raw source coverage, conversion dilution, booking-tool referral overwrites, and capture gaps. Writing the thresholds down keeps anyone from bending them after the fact. A few have already been revised when outside evidence said ours were too loose.
The rule we got wrong the most times: a phone call with no website visit behind it, from a Google Business Profile call button or a saved number, correctly shows no source in GA4. That’s not broken tracking, and the answer isn’t a fix at all: those calls get counted in their own bucket. The actual red flag is the opposite, a call that did come through the website showing no source. It took three wrong diagnoses on real accounts to land that distinction.
Booking software gets its own check because of what we found at the dumpster company: their booking tool was recorded as the “source” of 27% of their leads, hiding the ads and searches that actually drove them. One settings change reassigns that credit going forward.
Winners & Opportunities: how the owner reads it
A local service owner doesn’t want a data dump. Every dimension in the report renders as a pair: what’s producing, and what’s worth a look. Channels first, then pages, then cities.
The line that makes an opportunity real is expected-versus-actual: “Arlington sent enough visitors for about 4 leads at your normal rate; it produced 0.” Simple arithmetic, with guards. Nothing qualifies as an opportunity without enough traffic to expect at least two leads, and we never rank five “winners” when three of them have one lead each.
The math has already been wrong once. On an account where 83% of leads were phone calls, calls that can’t be placed on a page or a city, the blended lead rate implied the homepage “should” have produced 37 leads. The test run caught it, and the corrected rule ships with the version below: compute the rate only on leads that can actually be placed on the thing being ranked.
Everything investigative stays out of the client’s copy. No grades, no thresholds, no jargon. They see plain English: what happened, what it means, what we’re doing, and the one thing to start with.
The quality checks, and why the agent doesn’t grade itself
We tested by running the report on live accounts with the same mid-tier model that runs it in production, then grading the outputs cold. The agent graded its own reports A- every time. Independent graders scored those same reports B, B+, and C-. One report told a client GA4 “shows about 44 leads” when the dashboard shows 64. Another recommended a Google call-tracking product that does not exist.
So every report now passes three checks before a person reads it. A mechanical scan first: jargon that shouldn’t reach a client, missing comparisons, tables that don’t sum to their own headline. Then the agent’s own grade against a written rubric, useful as a first filter and clearly not sufficient on its own. Then a second reviewer with no memory of writing the report checks every number against the pulled data and every recommendation against our reference notes on how these tools actually behave. A human reviews last, and still catches things.
Mistakes become rules
When a run gets something wrong in a way that would affect every client, the fix gets written down: what broke, which account surfaced it, what changed. The phone-call rule, the booking-tool check, the dead-property gate, the opportunity-math correction all started as mistakes on real accounts, most of them within the last few weeks. It will be wrong again. The goal is to not repeat the old ones.
Test runs so far
Two weeks of testing, not a decade of case studies. Anonymized where the finding exposes a client’s tracking debt:
- Dumpster rental company. Pre-flight caught a dead handed-off property; the live one was in another account. Booking tool held 27% of lead credit.
- The same account, two weeks later. The run caught that the booking-tool fix recommended in the prior report was never actually applied. Past recommendations now get re-verified by date.
- Painting company. 19 reported leads, ~92 reconstructed, minus overseas spam. The graders also caught this report inventing a mechanism for how Google Business Profile connects to GA4; that became a rule.
- Law firm. 72% of “conversions” were giveaway entries; most real leads carried no source; a TV campaign was tagged in a way GA4 couldn’t read.
- Turf company. Form-start events with no completion event, meaning form leads weren’t tracked at all, plus call-tracking source data sitting unregistered in custom dimensions.
- Garage-door repair company. The phone-heavy account that broke the opportunity math, above. The same run also invented the call-tracking product that doesn’t exist. Both became rules.
- Two prospects with no property at all. The run stopped and asked the two-path question: never installed, or never shared?
- Fitness equipment brand. Global B2B, two live regional properties, no service area. Our worst graded report (C-), because we ran a local-service playbook on a business it wasn’t built for. The playbook now says what it’s for and flags mismatches instead of forcing the fit.
Related frameworks
- Weekly MAA Report — the umbrella client report this GA4 block feeds into
- The Maps Visibility System — the same measurement-first approach applied to Google Maps
- Dollar a Day — where the winning content and channels go to get amplified
- The Quick Audit — the free diagnosis that usually surfaces the tracking debt this report then works through
Why publish an unfinished SOP
Two reasons. Documenting each run is how the process sharpens, the approach Dennis Yu lays out in his meta-article process, and the documentation is only worth something if the failures stay in it. And publishing the method means you can hand this page to your own AI agent and try it on your own GA4. If it breaks on a case we haven’t hit, we’d rather hear about it now.
QA checklist
Every report must pass all twelve before a human sees it. The human still reviews before the client does.
- Client file read first; settled facts not re-litigated.
- Property confirmed live; ghost and multi-property cases resolved or escalated. Never analyze a dead account.
- Full event inventory pulled; every lead event sorted case / list-building / micro; the definition confirmed or marked proposed.
- Reconstructed count checked against GA4’s; gap stated and labeled explained or unexplained.
- Spam screen applied to both comparison windows when spam appears.
- Off-site calls counted in their own bucket, never mislabeled as broken tracking.
- Every client-facing number carries a comparison and % change; every table sums to its headline.
- Winners & Opportunities guards applied, with the lead rate computed only on leads that carry the dimension being ranked.
- No internal jargon in the client text.
- Every recommendation traces to our reference notes, the pulled data, or an explicit “we’ll confirm the right approach.” No invented products, no impossible fixes.
- Actions are future work only; the start-here line is one move, not a restatement.
- Second-reviewer grade recorded beside the self-grade; human review before posting; client file updated after.
Skill file
Current as of this writing (v5.2). It changes as the lessons accumulate.
---
name: ga4-website-maa
description: Produce the investigative Website / GA4 MAA for a
local-service client. Establishes data trust first (pre-flight,
Data Clarity), reconstructs and classifies leads, and outputs a
client report in the Winners & Opportunities format. GA4 only;
organic search terms belong to a GSC agent, paid depth to an
Ads agent. Scope: local service, bounded area, one live property.
---
## Inputs
- Client Narrative (live property ID, locked lead definition, known
issues, open questions). No Narrative = first touch: propose the
lead classification, get human confirmation, seed the Narrative.
- GA4 Data API access, read-only. Every fix is an action for a human.
- Windows: current = 28daysAgo..yesterday, prior = 56..29daysAgo.
Never include today.
## Phases
0. PRE-FLIGHT. Sessions by date, 28d. Live (>=10 sessions/week) ->
proceed. Dead -> search account for live same-brand sibling.
2+ live siblings -> ask which is in scope. None accessible ->
STOP, escalate (distinguish: access not shared vs not installed).
Never fabricate. Check out-of-scope signals (multi-region, B2B,
no service area): 2+ -> flag, adapt, don't force local framing.
1. STANDARD PULL, fixed: Q1 event inventory (eventCount + keyEvents),
Q2 channel mix, Q3 source/medium top 25, Q4 lead events x source,
Q5 landing + lead pages, Q6 geo of leads (ordered by sessions AND
by leads), Q7 13-week trend (drop partial week), Q8 new-vs-return.
2. LEAD RECONSTRUCTION. Classify every event: case lead (calls,
contact/quote forms, bookings, qualified chat, real text leads) /
list-building (giveaways, newsletters, chat opens) / micro
(form_start, scroll, video, page_view, generic form dupes,
scheduler clicks). repeat_phone_call = existing customer.
form_submit is a candidate until verified vs a known count.
Reconcile vs GA4 count; gap >1.5x = finding; label explained or
unexplained. Spam-screen leads vs service area, both windows.
3. DATA CLARITY, thresholds not vibes: Direct share (watch >20-25%,
alarm >40%); Direct surge = +50% PoP AND engagement falling AND
>=90% new; Unassigned >10%; non-standard UTM mediums; lead
attribution with the CALLS TOUCHPOINT RULE (no-web-touch calls
correctly land (not set): segment, don't diagnose; unattributed
FORMS are a real problem); clean coverage = paid+organic+real
referral only, never count Direct as attributed; dilution = one
non-case event >50% of key events; booking/CRM referral domain
carrying >=10% of leads = source overwrite -> referral exclusion
(not retroactive, 50-domain cap); capture gaps. Near-threshold
(within 20%) = watch item. Grade internally: Clear / Hazy /
Opaque. Opaque -> clarity-first report.
4. EXPANSIONS only on triggers: call attribution question -> check
registered custom dims (CallRail pattern: first_time_phone_call;
vendor mechanics vary, verify per tool); paid present -> note
lead rate, depth belongs to Ads agent; trend anomaly -> check
annotations; conversion->zero = broken tag until proven.
GBP: never infer link status from traffic; a GBP link does NOT
surface data in this pipeline; grounded moves are UTM-tagging
the GBP website link or a human settings check.
5. VERIFY: facts stated only when the data shows them; hypotheses
as "may indicate"; else emit a verification action. Re-verify by
date that past recommended fixes actually landed.
6. REPORT (machinery internal, plain English): 1 pulse (leads count
+ mix vs prior, leads first) · 2 numbers shown (13-wk trend, then
Winners & Opportunities pairs: channels -> pages -> cities; each
top-5 max; expected-vs-actual line; guards: expected >= 2 leads
using ONLY dimension-attributable lead types, lead rate < 25% of
that rate, collapse single-lead winners, completion pages never
rank) · 3 what it means · 4 what we're doing (2-3 forward-only
actions, client asks named) · 5 start here (one move).
Every number has a comparison. Prescriptions only from the
integration reference, pulled data, or an explicit hedge. Never
present derived counts as GA4-reported figures. Hedge fixes:
"should," never "will."
7. QA GATES: (a) mechanical lint: banned vocab (grades, coverage,
reconciliation, key events, case leads...), comparisons present,
tables sum to headline, actions future-tense; (b) self-grade vs
the 9-criterion rubric; (c) fresh-context external grader checks
every number vs the data and every prescription vs the reference.
Human review before posting. Then writeback: report to the vault,
dated Narrative log entry, system-level gaps to the decisions log.
## QA
Run the 12-point checklist in the parent definitive article. All
items must pass before the report ships.
Your GA4 is probably lying to you right now; the only question is in which direction. Request your free Quick Audit and we’ll run the diagnosis before anyone prescribes a thing.
