# Agent traffic measurement

> Agent traffic measurement: If agent traffic is not measured separately, the channel's return is invisible and never funded.

- Source: /checks/agent-analytics
- Site: AgenticWebScore
- Language: English

---
If agent traffic is not measured separately, the channel's return is invisible and never funded.

| Property | Value |
| --- | --- |
| Check id | `agent-analytics` |
| Dimension | Commerce Protocols (15%) |
| Tier | Emerging — pool 5 pts |
| Weight inside tier | 1 |
| Impact | Low |
| Maturity | Draft — A published specification that is not yet ratified. |
| Conditional | Yes — scored only on commercial sites |
| Publishing skill | `agent-analytics` |
| Standards | — |

## What is measured

Conditional: reported n/a unless the scanner has already detected a commercial signal (Product/Offer JSON-LD, add-to-cart or buy-now copy, a cart/checkout link). It reads the homepage document as lowercase text and looks for an analytics platform signature (segment, plausible, posthog, matomo, amplitude, mixpanel, googletagmanager or yandex.metrika) together with a marker that agents are segmented separately, such as an agent_category custom dimension or an explicit agent event - a vendor signature plus that agent marker passes, a vendor with no agent segmentation is a partial (0.8), and no vendor signature at all is a partial (0.5) because nothing about the channel can be attributed.

## Reproduce it yourself

You do not have to take our word for any of this. Run the same measurement against your own domain:

```bash
DOMAIN=shop.example.com
curl -sL "https://$DOMAIN/" | grep -Eoi 'segment|plausible|posthog|matomo|amplitude|mixpanel|googletagmanager|yandex\.metrika|agent_category' | sort -u
```

## The fix

This is the artifact to ship. It is the complete change, not a description of one.

```javascript
// Agent traffic as its own analytics segment. Verified agents arrive with a signed request and
// unknown crawlers are matched on user-agent; both are tagged, humans are tagged too.
const AGENT_UA = /GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|PerplexityBot|Google-Extended|Applebot-Extended/i;
const ua = navigator.userAgent;
const match = ua.match(AGENT_UA);
const agent_category = match ? 'agent' : 'human';

// Plausible here; swap for your own vendor (gtag, segment.track, posthog.capture).
window.plausible = window.plausible || function () { (window.plausible.q = window.plausible.q || []).push(arguments); };
plausible('pageview', { props: {
  agent_category: agent_category,
  agent_vendor: match ? match[0] : 'none'
} });

// Register agent_category as an event-scoped custom dimension, then report weekly on agent
// sessions, agent-assisted orders and revenue per agent vendor.
```

> Crawler agents do not execute JavaScript, so emit the same event server-side or at the edge for non-JS hits — a client-only implementation undercounts exactly the traffic this check is about.

## Related checks

| Check | Tier | Impact | Same skill |
| --- | --- | --- | --- |
| `product-schema` — Product/catalog schema | Essential | Critical | — |
| `payment-protocols` — Agent payment standard support (AP2/ACP/x402/UCP) | Recommended | High | — |
| `agent-purchase` — Agent purchase policy | Recommended | High | — |
| `ucp-manifest` — UCP manifest (/.well-known/ucp) | Emerging | Medium | — |
| `returns` — Return and shipping terms machine-readable | Recommended | Medium | — |
| `inventory-freshness` — Inventory and price freshness | Recommended | High | — |
| `seller-identity` — Seller identity declared | Recommended | Medium | — |
| `shipping-costs` — Shipping cost and delivery declared | Recommended | High | — |
