> ## Documentation Index
> Fetch the complete documentation index at: https://tinyanalytics.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# How Analytics Bot Detection Works

> See how user agents, datacenter networks, and request behavior identify automated traffic before it reaches human analytics reports.

tinyanalytics filters out bots and crawlers before they reach your reports, so your numbers reflect **real people**. Detection runs several independent layers on every incoming event, and a request flagged by any of them is dropped from your human analytics — while still returning a normal response, so a bot can't tell it was caught.

```mermaid theme={null}
flowchart LR
  A["Incoming event"] --> B["Known user-agent signals"]
  A --> C["Bot-network signals"]
  A --> D["Request-behavior signals"]
  A --> E["Automation signals"]
  B --> F{"Bot verdict"}
  C --> F
  D --> F
  E --> F
  F -- "Human" --> G["Human analytics"]
  F -- "Automated" --> H["Bot traffic store"]
  H --> I["Bots & AI crawlers report"]
```

## The detection layers

tinyanalytics judges each request with layers that each catch a different kind of automation:

* **Known bot user agents** — a large, categorized list of crawler signatures, including named bots like `Googlebot`, `GPTBot`, `ClaudeBot`, and `AhrefsBot`, plus scripting tools like `curl` and `python-requests`. Each match is tagged with a category (search, AI, social, monitoring, SEO, security, and more).
* **Bot networks (ASN)** — requests from networks dedicated to bots, scanners, and AI-agent infrastructure are caught even when they arrive with a normal-looking browser user agent.
* **Request-behavior heuristics** — missing headers a real browser always sends, request bursts and crawl-shaped traffic patterns, and known referrer-spam domains.
* **Automation signals** — signs that the browser is being driven by automation rather than a person.

## Real visitors on shared and cloud IPs aren't mislabeled

A visitor on a VPN, a corporate proxy, or a cloud-hosted browser can share an IP with a datacenter — so tinyanalytics treats a datacenter-network match as **supporting evidence only**. It never flags a request as a bot on that fact alone; another layer has to fire too. This keeps real people from being filtered out just because of where their traffic originates.

The same rule protects people on **shared networks** — carrier-grade NAT, office gateways, and campus Wi-Fi, where hundreds of real visitors leave through one IP. Signals that only describe a *crowd* behind an address (lots of requests, or lots of different browsers, from one IP) can corroborate a bot verdict but never convict on their own, so a busy shared network doesn't get mistaken for automation.

## Seeing the bots

Filtered bots don't disappear silently — the [bots & AI crawlers report](/docs/bot-ai-crawler-analytics) shows the automated traffic that was kept out of your human analytics, including which AI crawlers are visiting your site. Detected AI-assistant *referrals* (a real person arriving from an AI answer) are a separate signal, covered in [AI traffic](/docs/ai-referral-traffic-analytics).

## Related

<Columns cols={2}>
  <Card title="Bots & AI crawlers" icon="robot" href="/docs/bot-ai-crawler-analytics">
    The report of filtered bot traffic.
  </Card>

  <Card title="AI traffic" icon="microchip" href="/docs/ai-referral-traffic-analytics">
    Visitors who arrive from AI assistants.
  </Card>

  <Card title="How traffic is classified" icon="signs-post" href="/docs/resources/analytics-channel-attribution">
    How real referrers become channels.
  </Card>

  <Card title="How cookieless identity works" icon="fingerprint" href="/docs/resources/cookieless-analytics-identity">
    How human visitors are counted.
  </Card>
</Columns>


## Related topics

- [How tinyanalytics Works](/docs/how-tinyanalytics-works.md)
- [tinyanalytics vs Google Analytics, Plausible, and Umami](/docs/resources/tinyanalytics-vs-google-analytics-plausible-umami.md)
- [Exclude Internal and Unwanted Traffic](/docs/exclude-traffic-from-analytics.md)
