A residential painting contractor in a Northeast metro asked one plain question: how many real leads did the site produce last month? Our hosted GA4 agent screened the spam, rebuilt the real conversions, and answered it — 35 real leads, not the 7 the dashboard showed. The full anonymized report is linked at the bottom.
What the dashboard showed vs what the method found (last 28 days).
Proof ledger: every number here is reconstructed from the live GA4 property and shown in the report. The 35 is screened and counted from named lead events; the 7 is GA4’s own key-event total for the same window. The client name, towns, and property IDs are withheld — this is an anonymized run.
Break the spike down by channel
Total site visits were up 55 percent, 1,209 against 778. Stop there and you send the client a thumbs-up and move on. The agent did not stop there — it broke the growth down by channel and found almost all of it came from one place.
Paid Social, the Instagram and Facebook ads, jumped from 54 to 575 sessions, a 965 percent increase. Those visitors hit about 9 percent engagement and produced zero real leads. Strip that one channel out and real traffic fell about 12 percent. The headline “traffic up 55 percent” was true and useless.
Screen the spam before you compare
Before comparing any periods, the method screens junk. Two of the company’s city-specific quote forms were 100 percent non-local this period, tracing to clusters in the Netherlands, Iran, and Russia. Counted across everything, 140 of the 191 raw form and call events were foreign or bot traffic, and another 16 were real people outside the service area. That leaves the 35 real leads.
Count the leads GA4 hid
GA4’s own dashboard showed only 7 key events. Most of the company’s named lead events, a family of contact-form events plus click-to-call, were never registered as key events, so GA4 tracked them but did not count them. Screened and counted properly, the site produced 35 leads, five times the built-in number. The agent flagged the registration gap as a specific tracking fix so the next run starts from honest data.
Make three judgment calls a checklist would miss
One, it refused to celebrate the spike. A less careful pass reports “traffic up 55 percent.” The agent traced the growth to one non-converting channel and reversed the takeaway. Two, it counted unregistered lead events. The name of an event told it what it was even when the GA4 flag was missing, recovering 28 leads the dashboard dropped. Three, it turned a mystery into a question, not a guess. A video-consultation page dropped to zero mid-June; the agent did not invent a cause, it asked whether the page or its offer changed, which is the honest move.
Weigh the agent against a human hour
The run took the agent about nine minutes. A careful human analyst doing the same screening, reconstruction, and decomposition by hand runs two-and-a-half to three-and-a-half hours. Costs use Dennis’s benchmark of $35 an hour for a US digital marketer and current model token pricing.
| Phase | Agent time | Human time | Agent cost | Human cost ($35/hr) |
|---|---|---|---|---|
| Pre-flight and property check | ~1 min | 15–20 min | $0.03 | $9–12 |
| Pull events, sessions, geo, pages | ~2 min | 45–60 min | $0.10 | $26–35 |
| Screen spam and rebuild real leads | ~2 min | 40–60 min | $0.08 | $23–35 |
| Decompose the swing by channel and page | ~2 min | 30–45 min | $0.07 | $18–26 |
| Grade data trust and write two drafts | ~2 min | 30–40 min | $0.06 | $18–23 |
| TOTAL | ~9 min | 2.5–3.5 hrs | $0.34 | $94–131 |
Show the token receipt
Rough estimate for the single run, at Claude Sonnet token pricing. Ingestion is the GA4 data the agent pulled and reconciled, not documents.
| What the agent processed | Amount |
|---|---|
| GA4 API calls (properties, events, sessions, geo, pages, funnel) | 10+ |
| Comparison windows reconciled on the same basis | 2 (last 28 vs prior 28) |
| Raw lead events screened down to real leads | 191 → 35 |
| Live property analyzed (ghost property excluded) | 1 |
| Estimated tokens consumed (input + output) | ~120K |
| Estimated token cost | ~$0.34 |
Score it against the guidelines
The published article is graded against our blog posting guidelines. Scan the scorecard, handle the needs-human rows, approve.
| Writing guideline | Status | Notes |
|---|---|---|
| Hook opens with a specific situation | PASS | A named question about one client’s month |
| Answer in the first paragraph | PASS | 35 real leads, down 27 percent |
| Written in the figurehead’s voice | PASS | Daniel Goodrich, first person |
| Short paragraphs, active voice | PASS | |
| No AI fluff phrases | PASS | Checked against the banned list |
| Title under 60 chars / 13 words | PARTIAL | 61 chars, 12 words — one over the 60-char target |
| H2 structure, no heading abuse | PASS | Verb-first H2s, no H3 |
| 2–3 internal links to related articles | PASS | Method, hosted-agent, the-system |
| Entity links follow the decision tree | PASS | |
| Client anonymized | PASS | No name, town, or property ID |
| Cost + token tables present | PASS | Both required tables included |
| Deliverable button to the report | PASS | Links the anonymized PDF |
| Featured image from a real photo | NEEDS HUMAN | Agent cannot take photos |
| RankMath SEO configured | NEEDS HUMAN | Agent supplies metadata; human enters it |
Draw the line the agent will not cross
The agent handled the whole analysis: pulling the data, screening spam, rebuilding leads, decomposing the swing, grading trust, and writing both drafts. It stopped at three things on purpose. It never sends anything to a client without a human approving it. It did not guess the cause of the video-page drop. And it flagged, rather than silently fixed, the tracking-registration gap, because that is the client’s change to make.
The full client-facing draft plus the internal notes section, with the client’s name, towns, and property IDs removed.
This meta article documents one run of the hosted GA4 agent. It follows the definitive method at the GA4 reporting method and the build story at how we hosted the agent. This is how we document our work: run the process, then let the system document itself.
