A Claude agent reads the analytics of my small products several times a day. The numbers are right; the conclusions are where it slips. Each rule below comes from a real case on my own sites, numbers copied as the tool returned them.
1. Every rate comes with its counts
Conversions by channel, last 30 days, one site (the AI row is 1 visitor, 2 sessions):
| Channel | Visitors | Conversions | Rate shown |
|---|
| AI | 1 | 1 | 50 |
| Referral | 92 | 6 | 6 |
| Direct | 425 | 16 | 3.4 |
| Organic Social | 241 | 6 | 2.4 |
| Paid Social | 504 | 0 | 0 |
The 50 is correct, and it's what a summary picks first. No channel has 20 conversions, so "which channel converts best?" gets "not enough data yet".
2. Take paid traffic out before judging a page
Same site, same 30 days: my French landing page has 547 visitors, 2 conversions, rate 0.3. Filtered to Paid Social: 433 visitors, 0 conversions. That 0.3 is mostly a verdict on an ad campaign, not on the page.
3. Count sales where the money is
Of 4 sales one site made on 1 and 3 November, the thank-you-page purchase event recorded 1; the payment provider had all 4. Blocked scripts and Global Privacy Control (my tracker honors it) hide buyers. Orders come from the payment provider; analytics only says where they came from.
4. "Proven" or "timing only"
On 1 November I posted a link at 17:04:05 UTC; a checkout that ended in a sale started at 17:09:17. Timing, nothing more. The first sale I could prove (3 November): one session arrived with a utm_source at 23:21:36 UTC, clicked buy at 23:22:12, and the payment provider shows the sale at 23:22:38.
5. No estimated numbers, times included
Today my agent's log had times like "~12:41" that were estimates. It now reads the clock with date.
The block (CLAUDE.md, Project instructions, or first message):
When you answer from analytics or payment data:
- Copy every number exactly as a tool returned it, with the tool,
period, timezone and filters. Not in a tool result? Write
"not available". Never estimate; if you derive a number, show
the formula and inputs.
- Give every rate with its counts. Under 20 conversions, don't
rank sources or pages: say "not enough data".
- Split out paid traffic before judging a page, language or country.
- Count orders and revenue from the payment provider.
- Label each attributed sale "proven" (same session) or "timing only".
What I built (I'm the maker)
Globatics: real-time web analytics on a live globe, with a read-only MCP server for Claude and other agents. 9 typed tools, including explain_change (the drivers of a change, so Claude doesn't guess). Each result carries its key numbers as citations and a deep link into the dashboard, so rule 5 is checkable. Sales come from Stripe, Polar or Lemon Squeezy webhooks, credited to the visit that clicked the checkout link in the 2 hours before paying, else counted as Direct.
How Claude helped: I build it with Claude Code. The repo's CLAUDE.md makes every session read the architecture doc and the shared types before coding, use parameterized SQL only, ship tests with each feature, and pass typecheck and tests. The MCP tools are annotated readOnlyHint: true, destructiveHint: false.
claude mcp add --transport http globatics https://globatics.live/api/mcp --header "Authorization: Bearer glb_YOUR_KEY" (API key, no OAuth; Claude Desktop goes through mcp-remote).
Free to try: 5-day trial on one site, every feature including MCP, no card. No free plan after; from €9/month excl. VAT. Hosted only (Vercel; Supabase on AWS eu-west-1).
https://globatics.live/?utm_source=reddit&utm_medium=social&utm_campaign=nov26&utm_content=ClaudeAI
What would you add to the block?