[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-posthog-filtering-bot-traffic":3,"mdc-5srno8-key":48,"related-org-posthog-filtering-bot-traffic":2459,"related-repo-posthog-filtering-bot-traffic":2625},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":43,"sourceUrl":46,"mdContent":47},"filtering-bot-traffic","filter bot traffic in PostHog analytics","Identify, measure, and exclude bot \u002F crawler \u002F AI-agent traffic in PostHog web and product analytics using the traffic classification surface (the isLikelyBot \u002F getTrafficType HogQL functions and the $virt_* virtual properties). Use when the user asks to \"exclude bots\", \"filter out crawlers\", \"remove bot traffic from my numbers\", \"how much of my traffic is bots \u002F AI crawlers\", \"is GPTBot \u002F ChatGPT \u002F Claude hitting my site\", \"break down traffic by human vs bot\", or wants clean human-only counts in an insight or dashboard. For the real-time Live tab bot tiles, use exploring-live-traffic instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"posthog","PostHog","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fposthog.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Observability","observability","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Data Quality","data-quality",{"name":21,"slug":22,"type":15},"Analytics","analytics",35568,"https:\u002F\u002Fgithub.com\u002FPostHog\u002Fposthog","2026-07-31T05:51:56.555825",null,2977,[29,30,22,31,32,33,34,35,36,37,38,39,40,41,42],"ab-testing","ai-analytics","cdp","data-warehouse","experiments","feature-flags","javascript","product-analytics","python","react","session-replay","surveys","typescript","web-analytics",{"repoUrl":24,"stars":23,"forks":27,"topics":44,"description":45},[29,30,22,31,32,33,34,35,36,37,38,39,40,41,42],"🦔 PostHog is an all-in-one developer platform for building successful products. We offer product analytics, web analytics, session replay, error tracking, feature flags, experimentation, surveys, data warehouse, a CDP, and an AI product assistant to help debug your code, ship features faster, and keep all your usage and customer data in one stack.","https:\u002F\u002Fgithub.com\u002FPostHog\u002Fposthog\u002Ftree\u002FHEAD\u002Fproducts\u002Fweb_analytics\u002Fskills\u002Ffiltering-bot-traffic","---\nname: filtering-bot-traffic\ndescription: 'Identify, measure, and exclude bot \u002F crawler \u002F AI-agent traffic in PostHog web and product analytics using the traffic classification surface (the isLikelyBot \u002F getTrafficType HogQL functions and the $virt_* virtual properties). Use when the user asks to \"exclude bots\", \"filter out crawlers\", \"remove bot traffic from my numbers\", \"how much of my traffic is bots \u002F AI crawlers\", \"is GPTBot \u002F ChatGPT \u002F Claude hitting my site\", \"break down traffic by human vs bot\", or wants clean human-only counts in an insight or dashboard. For the real-time Live tab bot tiles, use exploring-live-traffic instead.'\n---\n\n# Filtering and measuring bot traffic\n\nPostHog classifies every request by user agent so you can tell humans apart from bots,\ncrawlers, and AI agents anywhere HogQL runs — the SQL editor, insights, trends, and Web\nanalytics breakdowns. This skill teaches you (the agent) how to use that classification to:\n\n- exclude bots so analytics reflect human traffic only\n- measure how much traffic is automated, and which bots \u002F operators are responsible\n- separate AI-agent traffic (worth measuring) from noise (worth dropping)\n- pick the right surface — virtual properties for the insight builder, functions for raw SQL\n\nFor real-time (\"right now\", last 30 min) bot questions and the Live tab tiles, use the\n**exploring-live-traffic** skill instead. This skill is for historical windows, saved\ninsights, dashboards, and filtering.\n\n## When to use this skill\n\nUse it when the user wants to:\n\n- exclude or filter out bots (\"remove bots from my pageviews\", \"humans only\")\n- quantify automated traffic (\"what % of traffic is bots?\", \"how much is AI crawlers?\")\n- find which bots hit them (\"which crawlers visit us?\", \"is ChatGPT reading our docs?\")\n- break a trend down by traffic type or bot name\n- measure AI-agent \u002F AI-search traffic specifically (AEO \u002F answer-engine visibility)\n\nDo **not** use it for the Live tab, real-time numbers, or the per-minute bot charts —\nthat is exploring-live-traffic.\n\n## The classification surface\n\nTwo equivalent ways to reach the same classification. Prefer **virtual properties** in the\ninsight builder and filters; use **functions** in hand-written SQL or when you need a value\nthe virtual properties don't expose.\n\n### Virtual properties (insight builder, filters, breakdowns)\n\nThese read the user agent for you (falling back from `$raw_user_agent` to `$user_agent`),\nso you don't pass anything in. Available wherever you pick an event property.\n\n| Property                 | Value                                                                                                                                                                                          |\n| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `$virt_is_bot`           | boolean — `true` for bots \u002F crawlers \u002F automation                                                                                                                                              |\n| `$virt_traffic_type`     | `Regular`, `AI Agent`, `Bot`, or `Automation`                                                                                                                                                  |\n| `$virt_traffic_category` | finer category, e.g. `ai_crawler`, `ai_search`, `ai_assistant`, `search_crawler`, `seo_crawler`, `social_crawler`, `monitoring`, `http_client`, `headless_browser`, `no_user_agent`, `regular` |\n| `$virt_bot_name`         | display name, e.g. `Googlebot`, `GPTBot`, `ClaudeBot`                                                                                                                                          |\n| `$virt_bot_operator`     | company behind the bot, e.g. `Google`, `OpenAI`, `Anthropic`                                                                                                                                   |\n\n### HogQL functions (raw SQL)\n\nPass the user agent explicitly. Use `coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent)`\nto cover both server-side (`$raw_user_agent`) and JS SDK (`$user_agent`) captures. The `nullIf`\nkeeps an empty `$raw_user_agent` from shadowing a real `$user_agent` and being misread as a bot —\nthis mirrors the expression the virtual properties use internally.\n\n| Function                 | Returns                                                                      |\n| ------------------------ | ---------------------------------------------------------------------------- |\n| `isLikelyBot(ua)`        | `true` if the UA matches a bot\u002Fautomation pattern (empty UA counts as a bot) |\n| `getTrafficType(ua)`     | `AI Agent` \u002F `Bot` \u002F `Automation` \u002F `Regular`                                |\n| `getTrafficCategory(ua)` | subcategory; `regular` for humans                                            |\n| `getBotType(ua)`         | same subcategory but empty string for humans — handy for filtering           |\n| `getBotName(ua)`         | bot name; empty for humans                                                   |\n| `getBotOperator(ua)`     | operator\u002Fcompany; empty for humans                                           |\n\n## Traffic types — what to keep vs drop\n\n`getTrafficType` \u002F `$virt_traffic_type` sorts every request into four buckets. The default\nmove differs per bucket — don't treat them all as noise:\n\n| Type         | What it is                                                                              | Default move                                                                 |\n| ------------ | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |\n| `Regular`    | Human visitors                                                                          | Keep                                                                         |\n| `AI Agent`   | AI crawlers, AI search, AI assistants (GPTBot, ClaudeBot, PerplexityBot, ChatGPT-User)  | Often **measure**, don't drop — these are how AI tools find and cite content |\n| `Bot`        | Search crawlers, SEO tools, social previews, monitoring (Googlebot, AhrefsBot, Pingdom) | Exclude from human metrics; track separately for SEO                         |\n| `Automation` | HTTP clients and headless browsers (curl, python-requests, Puppeteer)                   | Usually noise — exclude                                                      |\n\n## Recipes\n\n### Exclude bots from an insight (humans only)\n\nAdd a property filter `$virt_is_bot` `exact` `false`:\n\n```json\n{ \"key\": \"$virt_is_bot\", \"value\": [\"false\"], \"operator\": \"exact\", \"type\": \"event\" }\n```\n\nDrop it into any TrendsQuery \u002F FunnelsQuery \u002F etc. `properties`. Visitor, session, and\npageview counts then reflect human traffic only, without changing stored data.\n\nTo exclude a narrower slice (e.g. keep AI agents but drop monitoring + automation), filter\non `$virt_traffic_type` or `$virt_traffic_category` with `operator: is_not` instead.\n\n### What share of traffic is automated\n\nBreak a pageview trend down by `$virt_traffic_type`:\n\n```json\n{\n  \"kind\": \"TrendsQuery\",\n  \"dateRange\": { \"date_from\": \"-30d\" },\n  \"series\": [{ \"kind\": \"EventsNode\", \"event\": \"$pageview\", \"math\": \"total\" }],\n  \"breakdownFilter\": { \"breakdown\": \"$virt_traffic_type\", \"breakdown_type\": \"event\" },\n  \"trendsFilter\": { \"display\": \"ActionsBarValue\" }\n}\n```\n\n### Which bots \u002F operators are hitting us\n\nFilter to bots and break down by name (or `$virt_bot_operator` for company-level):\n\n```json\n{\n  \"kind\": \"TrendsQuery\",\n  \"dateRange\": { \"date_from\": \"-30d\" },\n  \"series\": [{ \"kind\": \"EventsNode\", \"event\": \"$pageview\", \"math\": \"total\" }],\n  \"properties\": [{ \"key\": \"$virt_is_bot\", \"value\": [\"true\"], \"operator\": \"exact\", \"type\": \"event\" }],\n  \"breakdownFilter\": { \"breakdown\": \"$virt_bot_name\", \"breakdown_type\": \"event\", \"breakdown_limit\": 25 },\n  \"trendsFilter\": { \"display\": \"ActionsBarValue\" }\n}\n```\n\n### Measure AI-agent traffic specifically\n\nFilter `$virt_traffic_type` `exact` `AI Agent`, break down by `$virt_bot_operator` to see\nwhich tools (OpenAI, Anthropic, Perplexity, …) read your site and which pages they hit.\n\n### Raw SQL equivalents\n\n```sql\n-- human pageviews only\nSELECT count() AS human_pageviews\nFROM events\nWHERE event = '$pageview'\n    AND NOT isLikelyBot(coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent))\n\n-- top bots by hits\nSELECT\n    getBotName(coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent)) AS bot,\n    getBotOperator(coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent)) AS operator,\n    count() AS hits\nFROM events\nWHERE event = '$pageview'\n    AND isLikelyBot(coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent))\nGROUP BY bot, operator\nORDER BY hits DESC\n```\n\n## Seeing bots that don't run JavaScript\n\nMost crawlers and AI agents never execute JS, so `posthog-js` never fires a `$pageview` for\nthem — they're invisible to client-side analytics. To measure them, the project must forward\nserver access logs as `$http_log` events carrying `$raw_user_agent`. If a user asks \"why\ndon't I see GPTBot when I know it's crawling us?\", the answer is almost always: no `$http_log`\ningestion. Point them at server-side capture (the **Vercel logs** source, an edge worker, or\nthe capture API) before building bot insights.\n\n## Gotchas\n\n- **Needs a captured user agent.** Classification is computed at query time from the event's\n  `$raw_user_agent` \u002F `$user_agent`, so it works on any historical event — there's no need to\n  restrict `dateRange.date_from`. The one requirement is that a user agent was captured; events\n  from sources that never set one can't be classified (and empty UAs fall through to\n  `Automation` \u002F `no_user_agent`, below).\n- **`isLikelyBot` is \"likely\".** Detection is a user-agent heuristic — some bots spoof\n  real browser UAs, and some legit tools use bot-like ones. Treat it as best-effort, not\n  ground truth.\n- **Empty user agent = bot.** Requests with no UA (server-to-server, misconfigured SDKs)\n  classify as `Automation` \u002F `no_user_agent`, so `isLikelyBot` returns `true`.\n- **Don't silently drop the host filter.** If the user is scoped to one domain, inherit\n  `$host` in `properties` — leaving it out changes the answer.\n- **Bot definitions evolve.** The detected-bot list changes over time, so re-running the\n  same query later can classify older events differently.\n",{"data":49,"body":50},{"name":4,"description":6},{"type":51,"children":52},"root",[53,62,68,93,106,113,118,146,158,164,183,190,212,476,482,531,689,695,712,830,836,842,869,1037,1050,1077,1083,1094,1497,1503,1515,2070,2076,2107,2113,2257,2263,2312,2318,2453],{"type":54,"tag":55,"props":56,"children":58},"element","h1",{"id":57},"filtering-and-measuring-bot-traffic",[59],{"type":60,"value":61},"text","Filtering and measuring bot traffic",{"type":54,"tag":63,"props":64,"children":65},"p",{},[66],{"type":60,"value":67},"PostHog classifies every request by user agent so you can tell humans apart from bots,\ncrawlers, and AI agents anywhere HogQL runs — the SQL editor, insights, trends, and Web\nanalytics breakdowns. This skill teaches you (the agent) how to use that classification to:",{"type":54,"tag":69,"props":70,"children":71},"ul",{},[72,78,83,88],{"type":54,"tag":73,"props":74,"children":75},"li",{},[76],{"type":60,"value":77},"exclude bots so analytics reflect human traffic only",{"type":54,"tag":73,"props":79,"children":80},{},[81],{"type":60,"value":82},"measure how much traffic is automated, and which bots \u002F operators are responsible",{"type":54,"tag":73,"props":84,"children":85},{},[86],{"type":60,"value":87},"separate AI-agent traffic (worth measuring) from noise (worth dropping)",{"type":54,"tag":73,"props":89,"children":90},{},[91],{"type":60,"value":92},"pick the right surface — virtual properties for the insight builder, functions for raw SQL",{"type":54,"tag":63,"props":94,"children":95},{},[96,98,104],{"type":60,"value":97},"For real-time (\"right now\", last 30 min) bot questions and the Live tab tiles, use the\n",{"type":54,"tag":99,"props":100,"children":101},"strong",{},[102],{"type":60,"value":103},"exploring-live-traffic",{"type":60,"value":105}," skill instead. This skill is for historical windows, saved\ninsights, dashboards, and filtering.",{"type":54,"tag":107,"props":108,"children":110},"h2",{"id":109},"when-to-use-this-skill",[111],{"type":60,"value":112},"When to use this skill",{"type":54,"tag":63,"props":114,"children":115},{},[116],{"type":60,"value":117},"Use it when the user wants to:",{"type":54,"tag":69,"props":119,"children":120},{},[121,126,131,136,141],{"type":54,"tag":73,"props":122,"children":123},{},[124],{"type":60,"value":125},"exclude or filter out bots (\"remove bots from my pageviews\", \"humans only\")",{"type":54,"tag":73,"props":127,"children":128},{},[129],{"type":60,"value":130},"quantify automated traffic (\"what % of traffic is bots?\", \"how much is AI crawlers?\")",{"type":54,"tag":73,"props":132,"children":133},{},[134],{"type":60,"value":135},"find which bots hit them (\"which crawlers visit us?\", \"is ChatGPT reading our docs?\")",{"type":54,"tag":73,"props":137,"children":138},{},[139],{"type":60,"value":140},"break a trend down by traffic type or bot name",{"type":54,"tag":73,"props":142,"children":143},{},[144],{"type":60,"value":145},"measure AI-agent \u002F AI-search traffic specifically (AEO \u002F answer-engine visibility)",{"type":54,"tag":63,"props":147,"children":148},{},[149,151,156],{"type":60,"value":150},"Do ",{"type":54,"tag":99,"props":152,"children":153},{},[154],{"type":60,"value":155},"not",{"type":60,"value":157}," use it for the Live tab, real-time numbers, or the per-minute bot charts —\nthat is exploring-live-traffic.",{"type":54,"tag":107,"props":159,"children":161},{"id":160},"the-classification-surface",[162],{"type":60,"value":163},"The classification surface",{"type":54,"tag":63,"props":165,"children":166},{},[167,169,174,176,181],{"type":60,"value":168},"Two equivalent ways to reach the same classification. Prefer ",{"type":54,"tag":99,"props":170,"children":171},{},[172],{"type":60,"value":173},"virtual properties",{"type":60,"value":175}," in the\ninsight builder and filters; use ",{"type":54,"tag":99,"props":177,"children":178},{},[179],{"type":60,"value":180},"functions",{"type":60,"value":182}," in hand-written SQL or when you need a value\nthe virtual properties don't expose.",{"type":54,"tag":184,"props":185,"children":187},"h3",{"id":186},"virtual-properties-insight-builder-filters-breakdowns",[188],{"type":60,"value":189},"Virtual properties (insight builder, filters, breakdowns)",{"type":54,"tag":63,"props":191,"children":192},{},[193,195,202,204,210],{"type":60,"value":194},"These read the user agent for you (falling back from ",{"type":54,"tag":196,"props":197,"children":199},"code",{"className":198},[],[200],{"type":60,"value":201},"$raw_user_agent",{"type":60,"value":203}," to ",{"type":54,"tag":196,"props":205,"children":207},{"className":206},[],[208],{"type":60,"value":209},"$user_agent",{"type":60,"value":211},"),\nso you don't pass anything in. Available wherever you pick an event property.",{"type":54,"tag":213,"props":214,"children":215},"table",{},[216,235],{"type":54,"tag":217,"props":218,"children":219},"thead",{},[220],{"type":54,"tag":221,"props":222,"children":223},"tr",{},[224,230],{"type":54,"tag":225,"props":226,"children":227},"th",{},[228],{"type":60,"value":229},"Property",{"type":54,"tag":225,"props":231,"children":232},{},[233],{"type":60,"value":234},"Value",{"type":54,"tag":236,"props":237,"children":238},"tbody",{},[239,265,309,402,439],{"type":54,"tag":221,"props":240,"children":241},{},[242,252],{"type":54,"tag":243,"props":244,"children":245},"td",{},[246],{"type":54,"tag":196,"props":247,"children":249},{"className":248},[],[250],{"type":60,"value":251},"$virt_is_bot",{"type":54,"tag":243,"props":253,"children":254},{},[255,257,263],{"type":60,"value":256},"boolean — ",{"type":54,"tag":196,"props":258,"children":260},{"className":259},[],[261],{"type":60,"value":262},"true",{"type":60,"value":264}," for bots \u002F crawlers \u002F automation",{"type":54,"tag":221,"props":266,"children":267},{},[268,277],{"type":54,"tag":243,"props":269,"children":270},{},[271],{"type":54,"tag":196,"props":272,"children":274},{"className":273},[],[275],{"type":60,"value":276},"$virt_traffic_type",{"type":54,"tag":243,"props":278,"children":279},{},[280,286,288,294,295,301,303],{"type":54,"tag":196,"props":281,"children":283},{"className":282},[],[284],{"type":60,"value":285},"Regular",{"type":60,"value":287},", ",{"type":54,"tag":196,"props":289,"children":291},{"className":290},[],[292],{"type":60,"value":293},"AI Agent",{"type":60,"value":287},{"type":54,"tag":196,"props":296,"children":298},{"className":297},[],[299],{"type":60,"value":300},"Bot",{"type":60,"value":302},", or ",{"type":54,"tag":196,"props":304,"children":306},{"className":305},[],[307],{"type":60,"value":308},"Automation",{"type":54,"tag":221,"props":310,"children":311},{},[312,321],{"type":54,"tag":243,"props":313,"children":314},{},[315],{"type":54,"tag":196,"props":316,"children":318},{"className":317},[],[319],{"type":60,"value":320},"$virt_traffic_category",{"type":54,"tag":243,"props":322,"children":323},{},[324,326,332,333,339,340,346,347,353,354,360,361,367,368,374,375,381,382,388,389,395,396],{"type":60,"value":325},"finer category, e.g. ",{"type":54,"tag":196,"props":327,"children":329},{"className":328},[],[330],{"type":60,"value":331},"ai_crawler",{"type":60,"value":287},{"type":54,"tag":196,"props":334,"children":336},{"className":335},[],[337],{"type":60,"value":338},"ai_search",{"type":60,"value":287},{"type":54,"tag":196,"props":341,"children":343},{"className":342},[],[344],{"type":60,"value":345},"ai_assistant",{"type":60,"value":287},{"type":54,"tag":196,"props":348,"children":350},{"className":349},[],[351],{"type":60,"value":352},"search_crawler",{"type":60,"value":287},{"type":54,"tag":196,"props":355,"children":357},{"className":356},[],[358],{"type":60,"value":359},"seo_crawler",{"type":60,"value":287},{"type":54,"tag":196,"props":362,"children":364},{"className":363},[],[365],{"type":60,"value":366},"social_crawler",{"type":60,"value":287},{"type":54,"tag":196,"props":369,"children":371},{"className":370},[],[372],{"type":60,"value":373},"monitoring",{"type":60,"value":287},{"type":54,"tag":196,"props":376,"children":378},{"className":377},[],[379],{"type":60,"value":380},"http_client",{"type":60,"value":287},{"type":54,"tag":196,"props":383,"children":385},{"className":384},[],[386],{"type":60,"value":387},"headless_browser",{"type":60,"value":287},{"type":54,"tag":196,"props":390,"children":392},{"className":391},[],[393],{"type":60,"value":394},"no_user_agent",{"type":60,"value":287},{"type":54,"tag":196,"props":397,"children":399},{"className":398},[],[400],{"type":60,"value":401},"regular",{"type":54,"tag":221,"props":403,"children":404},{},[405,414],{"type":54,"tag":243,"props":406,"children":407},{},[408],{"type":54,"tag":196,"props":409,"children":411},{"className":410},[],[412],{"type":60,"value":413},"$virt_bot_name",{"type":54,"tag":243,"props":415,"children":416},{},[417,419,425,426,432,433],{"type":60,"value":418},"display name, e.g. ",{"type":54,"tag":196,"props":420,"children":422},{"className":421},[],[423],{"type":60,"value":424},"Googlebot",{"type":60,"value":287},{"type":54,"tag":196,"props":427,"children":429},{"className":428},[],[430],{"type":60,"value":431},"GPTBot",{"type":60,"value":287},{"type":54,"tag":196,"props":434,"children":436},{"className":435},[],[437],{"type":60,"value":438},"ClaudeBot",{"type":54,"tag":221,"props":440,"children":441},{},[442,451],{"type":54,"tag":243,"props":443,"children":444},{},[445],{"type":54,"tag":196,"props":446,"children":448},{"className":447},[],[449],{"type":60,"value":450},"$virt_bot_operator",{"type":54,"tag":243,"props":452,"children":453},{},[454,456,462,463,469,470],{"type":60,"value":455},"company behind the bot, e.g. ",{"type":54,"tag":196,"props":457,"children":459},{"className":458},[],[460],{"type":60,"value":461},"Google",{"type":60,"value":287},{"type":54,"tag":196,"props":464,"children":466},{"className":465},[],[467],{"type":60,"value":468},"OpenAI",{"type":60,"value":287},{"type":54,"tag":196,"props":471,"children":473},{"className":472},[],[474],{"type":60,"value":475},"Anthropic",{"type":54,"tag":184,"props":477,"children":479},{"id":478},"hogql-functions-raw-sql",[480],{"type":60,"value":481},"HogQL functions (raw SQL)",{"type":54,"tag":63,"props":483,"children":484},{},[485,487,493,495,500,502,507,509,515,517,522,524,529],{"type":60,"value":486},"Pass the user agent explicitly. Use ",{"type":54,"tag":196,"props":488,"children":490},{"className":489},[],[491],{"type":60,"value":492},"coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent)",{"type":60,"value":494},"\nto cover both server-side (",{"type":54,"tag":196,"props":496,"children":498},{"className":497},[],[499],{"type":60,"value":201},{"type":60,"value":501},") and JS SDK (",{"type":54,"tag":196,"props":503,"children":505},{"className":504},[],[506],{"type":60,"value":209},{"type":60,"value":508},") captures. The ",{"type":54,"tag":196,"props":510,"children":512},{"className":511},[],[513],{"type":60,"value":514},"nullIf",{"type":60,"value":516},"\nkeeps an empty ",{"type":54,"tag":196,"props":518,"children":520},{"className":519},[],[521],{"type":60,"value":201},{"type":60,"value":523}," from shadowing a real ",{"type":54,"tag":196,"props":525,"children":527},{"className":526},[],[528],{"type":60,"value":209},{"type":60,"value":530}," and being misread as a bot —\nthis mirrors the expression the virtual properties use internally.",{"type":54,"tag":213,"props":532,"children":533},{},[534,550],{"type":54,"tag":217,"props":535,"children":536},{},[537],{"type":54,"tag":221,"props":538,"children":539},{},[540,545],{"type":54,"tag":225,"props":541,"children":542},{},[543],{"type":60,"value":544},"Function",{"type":54,"tag":225,"props":546,"children":547},{},[548],{"type":60,"value":549},"Returns",{"type":54,"tag":236,"props":551,"children":552},{},[553,575,614,638,655,672],{"type":54,"tag":221,"props":554,"children":555},{},[556,565],{"type":54,"tag":243,"props":557,"children":558},{},[559],{"type":54,"tag":196,"props":560,"children":562},{"className":561},[],[563],{"type":60,"value":564},"isLikelyBot(ua)",{"type":54,"tag":243,"props":566,"children":567},{},[568,573],{"type":54,"tag":196,"props":569,"children":571},{"className":570},[],[572],{"type":60,"value":262},{"type":60,"value":574}," if the UA matches a bot\u002Fautomation pattern (empty UA counts as a bot)",{"type":54,"tag":221,"props":576,"children":577},{},[578,587],{"type":54,"tag":243,"props":579,"children":580},{},[581],{"type":54,"tag":196,"props":582,"children":584},{"className":583},[],[585],{"type":60,"value":586},"getTrafficType(ua)",{"type":54,"tag":243,"props":588,"children":589},{},[590,595,597,602,603,608,609],{"type":54,"tag":196,"props":591,"children":593},{"className":592},[],[594],{"type":60,"value":293},{"type":60,"value":596}," \u002F ",{"type":54,"tag":196,"props":598,"children":600},{"className":599},[],[601],{"type":60,"value":300},{"type":60,"value":596},{"type":54,"tag":196,"props":604,"children":606},{"className":605},[],[607],{"type":60,"value":308},{"type":60,"value":596},{"type":54,"tag":196,"props":610,"children":612},{"className":611},[],[613],{"type":60,"value":285},{"type":54,"tag":221,"props":615,"children":616},{},[617,626],{"type":54,"tag":243,"props":618,"children":619},{},[620],{"type":54,"tag":196,"props":621,"children":623},{"className":622},[],[624],{"type":60,"value":625},"getTrafficCategory(ua)",{"type":54,"tag":243,"props":627,"children":628},{},[629,631,636],{"type":60,"value":630},"subcategory; ",{"type":54,"tag":196,"props":632,"children":634},{"className":633},[],[635],{"type":60,"value":401},{"type":60,"value":637}," for humans",{"type":54,"tag":221,"props":639,"children":640},{},[641,650],{"type":54,"tag":243,"props":642,"children":643},{},[644],{"type":54,"tag":196,"props":645,"children":647},{"className":646},[],[648],{"type":60,"value":649},"getBotType(ua)",{"type":54,"tag":243,"props":651,"children":652},{},[653],{"type":60,"value":654},"same subcategory but empty string for humans — handy for filtering",{"type":54,"tag":221,"props":656,"children":657},{},[658,667],{"type":54,"tag":243,"props":659,"children":660},{},[661],{"type":54,"tag":196,"props":662,"children":664},{"className":663},[],[665],{"type":60,"value":666},"getBotName(ua)",{"type":54,"tag":243,"props":668,"children":669},{},[670],{"type":60,"value":671},"bot name; empty for humans",{"type":54,"tag":221,"props":673,"children":674},{},[675,684],{"type":54,"tag":243,"props":676,"children":677},{},[678],{"type":54,"tag":196,"props":679,"children":681},{"className":680},[],[682],{"type":60,"value":683},"getBotOperator(ua)",{"type":54,"tag":243,"props":685,"children":686},{},[687],{"type":60,"value":688},"operator\u002Fcompany; empty for humans",{"type":54,"tag":107,"props":690,"children":692},{"id":691},"traffic-types-what-to-keep-vs-drop",[693],{"type":60,"value":694},"Traffic types — what to keep vs drop",{"type":54,"tag":63,"props":696,"children":697},{},[698,704,705,710],{"type":54,"tag":196,"props":699,"children":701},{"className":700},[],[702],{"type":60,"value":703},"getTrafficType",{"type":60,"value":596},{"type":54,"tag":196,"props":706,"children":708},{"className":707},[],[709],{"type":60,"value":276},{"type":60,"value":711}," sorts every request into four buckets. The default\nmove differs per bucket — don't treat them all as noise:",{"type":54,"tag":213,"props":713,"children":714},{},[715,736],{"type":54,"tag":217,"props":716,"children":717},{},[718],{"type":54,"tag":221,"props":719,"children":720},{},[721,726,731],{"type":54,"tag":225,"props":722,"children":723},{},[724],{"type":60,"value":725},"Type",{"type":54,"tag":225,"props":727,"children":728},{},[729],{"type":60,"value":730},"What it is",{"type":54,"tag":225,"props":732,"children":733},{},[734],{"type":60,"value":735},"Default move",{"type":54,"tag":236,"props":737,"children":738},{},[739,760,788,809],{"type":54,"tag":221,"props":740,"children":741},{},[742,750,755],{"type":54,"tag":243,"props":743,"children":744},{},[745],{"type":54,"tag":196,"props":746,"children":748},{"className":747},[],[749],{"type":60,"value":285},{"type":54,"tag":243,"props":751,"children":752},{},[753],{"type":60,"value":754},"Human visitors",{"type":54,"tag":243,"props":756,"children":757},{},[758],{"type":60,"value":759},"Keep",{"type":54,"tag":221,"props":761,"children":762},{},[763,771,776],{"type":54,"tag":243,"props":764,"children":765},{},[766],{"type":54,"tag":196,"props":767,"children":769},{"className":768},[],[770],{"type":60,"value":293},{"type":54,"tag":243,"props":772,"children":773},{},[774],{"type":60,"value":775},"AI crawlers, AI search, AI assistants (GPTBot, ClaudeBot, PerplexityBot, ChatGPT-User)",{"type":54,"tag":243,"props":777,"children":778},{},[779,781,786],{"type":60,"value":780},"Often ",{"type":54,"tag":99,"props":782,"children":783},{},[784],{"type":60,"value":785},"measure",{"type":60,"value":787},", don't drop — these are how AI tools find and cite content",{"type":54,"tag":221,"props":789,"children":790},{},[791,799,804],{"type":54,"tag":243,"props":792,"children":793},{},[794],{"type":54,"tag":196,"props":795,"children":797},{"className":796},[],[798],{"type":60,"value":300},{"type":54,"tag":243,"props":800,"children":801},{},[802],{"type":60,"value":803},"Search crawlers, SEO tools, social previews, monitoring (Googlebot, AhrefsBot, Pingdom)",{"type":54,"tag":243,"props":805,"children":806},{},[807],{"type":60,"value":808},"Exclude from human metrics; track separately for SEO",{"type":54,"tag":221,"props":810,"children":811},{},[812,820,825],{"type":54,"tag":243,"props":813,"children":814},{},[815],{"type":54,"tag":196,"props":816,"children":818},{"className":817},[],[819],{"type":60,"value":308},{"type":54,"tag":243,"props":821,"children":822},{},[823],{"type":60,"value":824},"HTTP clients and headless browsers (curl, python-requests, Puppeteer)",{"type":54,"tag":243,"props":826,"children":827},{},[828],{"type":60,"value":829},"Usually noise — exclude",{"type":54,"tag":107,"props":831,"children":833},{"id":832},"recipes",[834],{"type":60,"value":835},"Recipes",{"type":54,"tag":184,"props":837,"children":839},{"id":838},"exclude-bots-from-an-insight-humans-only",[840],{"type":60,"value":841},"Exclude bots from an insight (humans only)",{"type":54,"tag":63,"props":843,"children":844},{},[845,847,852,854,860,861,867],{"type":60,"value":846},"Add a property filter ",{"type":54,"tag":196,"props":848,"children":850},{"className":849},[],[851],{"type":60,"value":251},{"type":60,"value":853}," ",{"type":54,"tag":196,"props":855,"children":857},{"className":856},[],[858],{"type":60,"value":859},"exact",{"type":60,"value":853},{"type":54,"tag":196,"props":862,"children":864},{"className":863},[],[865],{"type":60,"value":866},"false",{"type":60,"value":868},":",{"type":54,"tag":870,"props":871,"children":876},"pre",{"className":872,"code":873,"language":874,"meta":875,"style":875},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"key\": \"$virt_is_bot\", \"value\": [\"false\"], \"operator\": \"exact\", \"type\": \"event\" }\n","json","",[877],{"type":54,"tag":196,"props":878,"children":879},{"__ignoreMap":875},[880],{"type":54,"tag":881,"props":882,"children":885},"span",{"class":883,"line":884},"line",1,[886,892,897,903,908,912,916,921,925,930,934,939,943,947,952,956,960,964,969,973,978,982,986,990,994,998,1002,1006,1011,1015,1019,1023,1028,1032],{"type":54,"tag":881,"props":887,"children":889},{"style":888},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[890],{"type":60,"value":891},"{",{"type":54,"tag":881,"props":893,"children":894},{"style":888},[895],{"type":60,"value":896}," \"",{"type":54,"tag":881,"props":898,"children":900},{"style":899},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[901],{"type":60,"value":902},"key",{"type":54,"tag":881,"props":904,"children":905},{"style":888},[906],{"type":60,"value":907},"\"",{"type":54,"tag":881,"props":909,"children":910},{"style":888},[911],{"type":60,"value":868},{"type":54,"tag":881,"props":913,"children":914},{"style":888},[915],{"type":60,"value":896},{"type":54,"tag":881,"props":917,"children":919},{"style":918},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[920],{"type":60,"value":251},{"type":54,"tag":881,"props":922,"children":923},{"style":888},[924],{"type":60,"value":907},{"type":54,"tag":881,"props":926,"children":927},{"style":888},[928],{"type":60,"value":929},",",{"type":54,"tag":881,"props":931,"children":932},{"style":888},[933],{"type":60,"value":896},{"type":54,"tag":881,"props":935,"children":936},{"style":899},[937],{"type":60,"value":938},"value",{"type":54,"tag":881,"props":940,"children":941},{"style":888},[942],{"type":60,"value":907},{"type":54,"tag":881,"props":944,"children":945},{"style":888},[946],{"type":60,"value":868},{"type":54,"tag":881,"props":948,"children":949},{"style":888},[950],{"type":60,"value":951}," [",{"type":54,"tag":881,"props":953,"children":954},{"style":888},[955],{"type":60,"value":907},{"type":54,"tag":881,"props":957,"children":958},{"style":918},[959],{"type":60,"value":866},{"type":54,"tag":881,"props":961,"children":962},{"style":888},[963],{"type":60,"value":907},{"type":54,"tag":881,"props":965,"children":966},{"style":888},[967],{"type":60,"value":968},"],",{"type":54,"tag":881,"props":970,"children":971},{"style":888},[972],{"type":60,"value":896},{"type":54,"tag":881,"props":974,"children":975},{"style":899},[976],{"type":60,"value":977},"operator",{"type":54,"tag":881,"props":979,"children":980},{"style":888},[981],{"type":60,"value":907},{"type":54,"tag":881,"props":983,"children":984},{"style":888},[985],{"type":60,"value":868},{"type":54,"tag":881,"props":987,"children":988},{"style":888},[989],{"type":60,"value":896},{"type":54,"tag":881,"props":991,"children":992},{"style":918},[993],{"type":60,"value":859},{"type":54,"tag":881,"props":995,"children":996},{"style":888},[997],{"type":60,"value":907},{"type":54,"tag":881,"props":999,"children":1000},{"style":888},[1001],{"type":60,"value":929},{"type":54,"tag":881,"props":1003,"children":1004},{"style":888},[1005],{"type":60,"value":896},{"type":54,"tag":881,"props":1007,"children":1008},{"style":899},[1009],{"type":60,"value":1010},"type",{"type":54,"tag":881,"props":1012,"children":1013},{"style":888},[1014],{"type":60,"value":907},{"type":54,"tag":881,"props":1016,"children":1017},{"style":888},[1018],{"type":60,"value":868},{"type":54,"tag":881,"props":1020,"children":1021},{"style":888},[1022],{"type":60,"value":896},{"type":54,"tag":881,"props":1024,"children":1025},{"style":918},[1026],{"type":60,"value":1027},"event",{"type":54,"tag":881,"props":1029,"children":1030},{"style":888},[1031],{"type":60,"value":907},{"type":54,"tag":881,"props":1033,"children":1034},{"style":888},[1035],{"type":60,"value":1036}," }\n",{"type":54,"tag":63,"props":1038,"children":1039},{},[1040,1042,1048],{"type":60,"value":1041},"Drop it into any TrendsQuery \u002F FunnelsQuery \u002F etc. ",{"type":54,"tag":196,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":60,"value":1047},"properties",{"type":60,"value":1049},". Visitor, session, and\npageview counts then reflect human traffic only, without changing stored data.",{"type":54,"tag":63,"props":1051,"children":1052},{},[1053,1055,1060,1062,1067,1069,1075],{"type":60,"value":1054},"To exclude a narrower slice (e.g. keep AI agents but drop monitoring + automation), filter\non ",{"type":54,"tag":196,"props":1056,"children":1058},{"className":1057},[],[1059],{"type":60,"value":276},{"type":60,"value":1061}," or ",{"type":54,"tag":196,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":60,"value":320},{"type":60,"value":1068}," with ",{"type":54,"tag":196,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":60,"value":1074},"operator: is_not",{"type":60,"value":1076}," instead.",{"type":54,"tag":184,"props":1078,"children":1080},{"id":1079},"what-share-of-traffic-is-automated",[1081],{"type":60,"value":1082},"What share of traffic is automated",{"type":54,"tag":63,"props":1084,"children":1085},{},[1086,1088,1093],{"type":60,"value":1087},"Break a pageview trend down by ",{"type":54,"tag":196,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":60,"value":276},{"type":60,"value":868},{"type":54,"tag":870,"props":1095,"children":1097},{"className":872,"code":1096,"language":874,"meta":875,"style":875},"{\n  \"kind\": \"TrendsQuery\",\n  \"dateRange\": { \"date_from\": \"-30d\" },\n  \"series\": [{ \"kind\": \"EventsNode\", \"event\": \"$pageview\", \"math\": \"total\" }],\n  \"breakdownFilter\": { \"breakdown\": \"$virt_traffic_type\", \"breakdown_type\": \"event\" },\n  \"trendsFilter\": { \"display\": \"ActionsBarValue\" }\n}\n",[1098],{"type":54,"tag":196,"props":1099,"children":1100},{"__ignoreMap":875},[1101,1109,1149,1211,1338,1429,1488],{"type":54,"tag":881,"props":1102,"children":1103},{"class":883,"line":884},[1104],{"type":54,"tag":881,"props":1105,"children":1106},{"style":888},[1107],{"type":60,"value":1108},"{\n",{"type":54,"tag":881,"props":1110,"children":1112},{"class":883,"line":1111},2,[1113,1118,1123,1127,1131,1135,1140,1144],{"type":54,"tag":881,"props":1114,"children":1115},{"style":888},[1116],{"type":60,"value":1117},"  \"",{"type":54,"tag":881,"props":1119,"children":1120},{"style":899},[1121],{"type":60,"value":1122},"kind",{"type":54,"tag":881,"props":1124,"children":1125},{"style":888},[1126],{"type":60,"value":907},{"type":54,"tag":881,"props":1128,"children":1129},{"style":888},[1130],{"type":60,"value":868},{"type":54,"tag":881,"props":1132,"children":1133},{"style":888},[1134],{"type":60,"value":896},{"type":54,"tag":881,"props":1136,"children":1137},{"style":918},[1138],{"type":60,"value":1139},"TrendsQuery",{"type":54,"tag":881,"props":1141,"children":1142},{"style":888},[1143],{"type":60,"value":907},{"type":54,"tag":881,"props":1145,"children":1146},{"style":888},[1147],{"type":60,"value":1148},",\n",{"type":54,"tag":881,"props":1150,"children":1152},{"class":883,"line":1151},3,[1153,1157,1162,1166,1170,1175,1179,1185,1189,1193,1197,1202,1206],{"type":54,"tag":881,"props":1154,"children":1155},{"style":888},[1156],{"type":60,"value":1117},{"type":54,"tag":881,"props":1158,"children":1159},{"style":899},[1160],{"type":60,"value":1161},"dateRange",{"type":54,"tag":881,"props":1163,"children":1164},{"style":888},[1165],{"type":60,"value":907},{"type":54,"tag":881,"props":1167,"children":1168},{"style":888},[1169],{"type":60,"value":868},{"type":54,"tag":881,"props":1171,"children":1172},{"style":888},[1173],{"type":60,"value":1174}," {",{"type":54,"tag":881,"props":1176,"children":1177},{"style":888},[1178],{"type":60,"value":896},{"type":54,"tag":881,"props":1180,"children":1182},{"style":1181},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1183],{"type":60,"value":1184},"date_from",{"type":54,"tag":881,"props":1186,"children":1187},{"style":888},[1188],{"type":60,"value":907},{"type":54,"tag":881,"props":1190,"children":1191},{"style":888},[1192],{"type":60,"value":868},{"type":54,"tag":881,"props":1194,"children":1195},{"style":888},[1196],{"type":60,"value":896},{"type":54,"tag":881,"props":1198,"children":1199},{"style":918},[1200],{"type":60,"value":1201},"-30d",{"type":54,"tag":881,"props":1203,"children":1204},{"style":888},[1205],{"type":60,"value":907},{"type":54,"tag":881,"props":1207,"children":1208},{"style":888},[1209],{"type":60,"value":1210}," },\n",{"type":54,"tag":881,"props":1212,"children":1214},{"class":883,"line":1213},4,[1215,1219,1224,1228,1232,1237,1241,1245,1249,1253,1257,1262,1266,1270,1274,1278,1282,1286,1290,1295,1299,1303,1307,1312,1316,1320,1324,1329,1333],{"type":54,"tag":881,"props":1216,"children":1217},{"style":888},[1218],{"type":60,"value":1117},{"type":54,"tag":881,"props":1220,"children":1221},{"style":899},[1222],{"type":60,"value":1223},"series",{"type":54,"tag":881,"props":1225,"children":1226},{"style":888},[1227],{"type":60,"value":907},{"type":54,"tag":881,"props":1229,"children":1230},{"style":888},[1231],{"type":60,"value":868},{"type":54,"tag":881,"props":1233,"children":1234},{"style":888},[1235],{"type":60,"value":1236}," [{",{"type":54,"tag":881,"props":1238,"children":1239},{"style":888},[1240],{"type":60,"value":896},{"type":54,"tag":881,"props":1242,"children":1243},{"style":1181},[1244],{"type":60,"value":1122},{"type":54,"tag":881,"props":1246,"children":1247},{"style":888},[1248],{"type":60,"value":907},{"type":54,"tag":881,"props":1250,"children":1251},{"style":888},[1252],{"type":60,"value":868},{"type":54,"tag":881,"props":1254,"children":1255},{"style":888},[1256],{"type":60,"value":896},{"type":54,"tag":881,"props":1258,"children":1259},{"style":918},[1260],{"type":60,"value":1261},"EventsNode",{"type":54,"tag":881,"props":1263,"children":1264},{"style":888},[1265],{"type":60,"value":907},{"type":54,"tag":881,"props":1267,"children":1268},{"style":888},[1269],{"type":60,"value":929},{"type":54,"tag":881,"props":1271,"children":1272},{"style":888},[1273],{"type":60,"value":896},{"type":54,"tag":881,"props":1275,"children":1276},{"style":1181},[1277],{"type":60,"value":1027},{"type":54,"tag":881,"props":1279,"children":1280},{"style":888},[1281],{"type":60,"value":907},{"type":54,"tag":881,"props":1283,"children":1284},{"style":888},[1285],{"type":60,"value":868},{"type":54,"tag":881,"props":1287,"children":1288},{"style":888},[1289],{"type":60,"value":896},{"type":54,"tag":881,"props":1291,"children":1292},{"style":918},[1293],{"type":60,"value":1294},"$pageview",{"type":54,"tag":881,"props":1296,"children":1297},{"style":888},[1298],{"type":60,"value":907},{"type":54,"tag":881,"props":1300,"children":1301},{"style":888},[1302],{"type":60,"value":929},{"type":54,"tag":881,"props":1304,"children":1305},{"style":888},[1306],{"type":60,"value":896},{"type":54,"tag":881,"props":1308,"children":1309},{"style":1181},[1310],{"type":60,"value":1311},"math",{"type":54,"tag":881,"props":1313,"children":1314},{"style":888},[1315],{"type":60,"value":907},{"type":54,"tag":881,"props":1317,"children":1318},{"style":888},[1319],{"type":60,"value":868},{"type":54,"tag":881,"props":1321,"children":1322},{"style":888},[1323],{"type":60,"value":896},{"type":54,"tag":881,"props":1325,"children":1326},{"style":918},[1327],{"type":60,"value":1328},"total",{"type":54,"tag":881,"props":1330,"children":1331},{"style":888},[1332],{"type":60,"value":907},{"type":54,"tag":881,"props":1334,"children":1335},{"style":888},[1336],{"type":60,"value":1337}," }],\n",{"type":54,"tag":881,"props":1339,"children":1341},{"class":883,"line":1340},5,[1342,1346,1351,1355,1359,1363,1367,1372,1376,1380,1384,1388,1392,1396,1400,1405,1409,1413,1417,1421,1425],{"type":54,"tag":881,"props":1343,"children":1344},{"style":888},[1345],{"type":60,"value":1117},{"type":54,"tag":881,"props":1347,"children":1348},{"style":899},[1349],{"type":60,"value":1350},"breakdownFilter",{"type":54,"tag":881,"props":1352,"children":1353},{"style":888},[1354],{"type":60,"value":907},{"type":54,"tag":881,"props":1356,"children":1357},{"style":888},[1358],{"type":60,"value":868},{"type":54,"tag":881,"props":1360,"children":1361},{"style":888},[1362],{"type":60,"value":1174},{"type":54,"tag":881,"props":1364,"children":1365},{"style":888},[1366],{"type":60,"value":896},{"type":54,"tag":881,"props":1368,"children":1369},{"style":1181},[1370],{"type":60,"value":1371},"breakdown",{"type":54,"tag":881,"props":1373,"children":1374},{"style":888},[1375],{"type":60,"value":907},{"type":54,"tag":881,"props":1377,"children":1378},{"style":888},[1379],{"type":60,"value":868},{"type":54,"tag":881,"props":1381,"children":1382},{"style":888},[1383],{"type":60,"value":896},{"type":54,"tag":881,"props":1385,"children":1386},{"style":918},[1387],{"type":60,"value":276},{"type":54,"tag":881,"props":1389,"children":1390},{"style":888},[1391],{"type":60,"value":907},{"type":54,"tag":881,"props":1393,"children":1394},{"style":888},[1395],{"type":60,"value":929},{"type":54,"tag":881,"props":1397,"children":1398},{"style":888},[1399],{"type":60,"value":896},{"type":54,"tag":881,"props":1401,"children":1402},{"style":1181},[1403],{"type":60,"value":1404},"breakdown_type",{"type":54,"tag":881,"props":1406,"children":1407},{"style":888},[1408],{"type":60,"value":907},{"type":54,"tag":881,"props":1410,"children":1411},{"style":888},[1412],{"type":60,"value":868},{"type":54,"tag":881,"props":1414,"children":1415},{"style":888},[1416],{"type":60,"value":896},{"type":54,"tag":881,"props":1418,"children":1419},{"style":918},[1420],{"type":60,"value":1027},{"type":54,"tag":881,"props":1422,"children":1423},{"style":888},[1424],{"type":60,"value":907},{"type":54,"tag":881,"props":1426,"children":1427},{"style":888},[1428],{"type":60,"value":1210},{"type":54,"tag":881,"props":1430,"children":1432},{"class":883,"line":1431},6,[1433,1437,1442,1446,1450,1454,1458,1463,1467,1471,1475,1480,1484],{"type":54,"tag":881,"props":1434,"children":1435},{"style":888},[1436],{"type":60,"value":1117},{"type":54,"tag":881,"props":1438,"children":1439},{"style":899},[1440],{"type":60,"value":1441},"trendsFilter",{"type":54,"tag":881,"props":1443,"children":1444},{"style":888},[1445],{"type":60,"value":907},{"type":54,"tag":881,"props":1447,"children":1448},{"style":888},[1449],{"type":60,"value":868},{"type":54,"tag":881,"props":1451,"children":1452},{"style":888},[1453],{"type":60,"value":1174},{"type":54,"tag":881,"props":1455,"children":1456},{"style":888},[1457],{"type":60,"value":896},{"type":54,"tag":881,"props":1459,"children":1460},{"style":1181},[1461],{"type":60,"value":1462},"display",{"type":54,"tag":881,"props":1464,"children":1465},{"style":888},[1466],{"type":60,"value":907},{"type":54,"tag":881,"props":1468,"children":1469},{"style":888},[1470],{"type":60,"value":868},{"type":54,"tag":881,"props":1472,"children":1473},{"style":888},[1474],{"type":60,"value":896},{"type":54,"tag":881,"props":1476,"children":1477},{"style":918},[1478],{"type":60,"value":1479},"ActionsBarValue",{"type":54,"tag":881,"props":1481,"children":1482},{"style":888},[1483],{"type":60,"value":907},{"type":54,"tag":881,"props":1485,"children":1486},{"style":888},[1487],{"type":60,"value":1036},{"type":54,"tag":881,"props":1489,"children":1491},{"class":883,"line":1490},7,[1492],{"type":54,"tag":881,"props":1493,"children":1494},{"style":888},[1495],{"type":60,"value":1496},"}\n",{"type":54,"tag":184,"props":1498,"children":1500},{"id":1499},"which-bots-operators-are-hitting-us",[1501],{"type":60,"value":1502},"Which bots \u002F operators are hitting us",{"type":54,"tag":63,"props":1504,"children":1505},{},[1506,1508,1513],{"type":60,"value":1507},"Filter to bots and break down by name (or ",{"type":54,"tag":196,"props":1509,"children":1511},{"className":1510},[],[1512],{"type":60,"value":450},{"type":60,"value":1514}," for company-level):",{"type":54,"tag":870,"props":1516,"children":1518},{"className":872,"code":1517,"language":874,"meta":875,"style":875},"{\n  \"kind\": \"TrendsQuery\",\n  \"dateRange\": { \"date_from\": \"-30d\" },\n  \"series\": [{ \"kind\": \"EventsNode\", \"event\": \"$pageview\", \"math\": \"total\" }],\n  \"properties\": [{ \"key\": \"$virt_is_bot\", \"value\": [\"true\"], \"operator\": \"exact\", \"type\": \"event\" }],\n  \"breakdownFilter\": { \"breakdown\": \"$virt_bot_name\", \"breakdown_type\": \"event\", \"breakdown_limit\": 25 },\n  \"trendsFilter\": { \"display\": \"ActionsBarValue\" }\n}\n",[1519],{"type":54,"tag":196,"props":1520,"children":1521},{"__ignoreMap":875},[1522,1529,1564,1619,1738,1893,2007,2062],{"type":54,"tag":881,"props":1523,"children":1524},{"class":883,"line":884},[1525],{"type":54,"tag":881,"props":1526,"children":1527},{"style":888},[1528],{"type":60,"value":1108},{"type":54,"tag":881,"props":1530,"children":1531},{"class":883,"line":1111},[1532,1536,1540,1544,1548,1552,1556,1560],{"type":54,"tag":881,"props":1533,"children":1534},{"style":888},[1535],{"type":60,"value":1117},{"type":54,"tag":881,"props":1537,"children":1538},{"style":899},[1539],{"type":60,"value":1122},{"type":54,"tag":881,"props":1541,"children":1542},{"style":888},[1543],{"type":60,"value":907},{"type":54,"tag":881,"props":1545,"children":1546},{"style":888},[1547],{"type":60,"value":868},{"type":54,"tag":881,"props":1549,"children":1550},{"style":888},[1551],{"type":60,"value":896},{"type":54,"tag":881,"props":1553,"children":1554},{"style":918},[1555],{"type":60,"value":1139},{"type":54,"tag":881,"props":1557,"children":1558},{"style":888},[1559],{"type":60,"value":907},{"type":54,"tag":881,"props":1561,"children":1562},{"style":888},[1563],{"type":60,"value":1148},{"type":54,"tag":881,"props":1565,"children":1566},{"class":883,"line":1151},[1567,1571,1575,1579,1583,1587,1591,1595,1599,1603,1607,1611,1615],{"type":54,"tag":881,"props":1568,"children":1569},{"style":888},[1570],{"type":60,"value":1117},{"type":54,"tag":881,"props":1572,"children":1573},{"style":899},[1574],{"type":60,"value":1161},{"type":54,"tag":881,"props":1576,"children":1577},{"style":888},[1578],{"type":60,"value":907},{"type":54,"tag":881,"props":1580,"children":1581},{"style":888},[1582],{"type":60,"value":868},{"type":54,"tag":881,"props":1584,"children":1585},{"style":888},[1586],{"type":60,"value":1174},{"type":54,"tag":881,"props":1588,"children":1589},{"style":888},[1590],{"type":60,"value":896},{"type":54,"tag":881,"props":1592,"children":1593},{"style":1181},[1594],{"type":60,"value":1184},{"type":54,"tag":881,"props":1596,"children":1597},{"style":888},[1598],{"type":60,"value":907},{"type":54,"tag":881,"props":1600,"children":1601},{"style":888},[1602],{"type":60,"value":868},{"type":54,"tag":881,"props":1604,"children":1605},{"style":888},[1606],{"type":60,"value":896},{"type":54,"tag":881,"props":1608,"children":1609},{"style":918},[1610],{"type":60,"value":1201},{"type":54,"tag":881,"props":1612,"children":1613},{"style":888},[1614],{"type":60,"value":907},{"type":54,"tag":881,"props":1616,"children":1617},{"style":888},[1618],{"type":60,"value":1210},{"type":54,"tag":881,"props":1620,"children":1621},{"class":883,"line":1213},[1622,1626,1630,1634,1638,1642,1646,1650,1654,1658,1662,1666,1670,1674,1678,1682,1686,1690,1694,1698,1702,1706,1710,1714,1718,1722,1726,1730,1734],{"type":54,"tag":881,"props":1623,"children":1624},{"style":888},[1625],{"type":60,"value":1117},{"type":54,"tag":881,"props":1627,"children":1628},{"style":899},[1629],{"type":60,"value":1223},{"type":54,"tag":881,"props":1631,"children":1632},{"style":888},[1633],{"type":60,"value":907},{"type":54,"tag":881,"props":1635,"children":1636},{"style":888},[1637],{"type":60,"value":868},{"type":54,"tag":881,"props":1639,"children":1640},{"style":888},[1641],{"type":60,"value":1236},{"type":54,"tag":881,"props":1643,"children":1644},{"style":888},[1645],{"type":60,"value":896},{"type":54,"tag":881,"props":1647,"children":1648},{"style":1181},[1649],{"type":60,"value":1122},{"type":54,"tag":881,"props":1651,"children":1652},{"style":888},[1653],{"type":60,"value":907},{"type":54,"tag":881,"props":1655,"children":1656},{"style":888},[1657],{"type":60,"value":868},{"type":54,"tag":881,"props":1659,"children":1660},{"style":888},[1661],{"type":60,"value":896},{"type":54,"tag":881,"props":1663,"children":1664},{"style":918},[1665],{"type":60,"value":1261},{"type":54,"tag":881,"props":1667,"children":1668},{"style":888},[1669],{"type":60,"value":907},{"type":54,"tag":881,"props":1671,"children":1672},{"style":888},[1673],{"type":60,"value":929},{"type":54,"tag":881,"props":1675,"children":1676},{"style":888},[1677],{"type":60,"value":896},{"type":54,"tag":881,"props":1679,"children":1680},{"style":1181},[1681],{"type":60,"value":1027},{"type":54,"tag":881,"props":1683,"children":1684},{"style":888},[1685],{"type":60,"value":907},{"type":54,"tag":881,"props":1687,"children":1688},{"style":888},[1689],{"type":60,"value":868},{"type":54,"tag":881,"props":1691,"children":1692},{"style":888},[1693],{"type":60,"value":896},{"type":54,"tag":881,"props":1695,"children":1696},{"style":918},[1697],{"type":60,"value":1294},{"type":54,"tag":881,"props":1699,"children":1700},{"style":888},[1701],{"type":60,"value":907},{"type":54,"tag":881,"props":1703,"children":1704},{"style":888},[1705],{"type":60,"value":929},{"type":54,"tag":881,"props":1707,"children":1708},{"style":888},[1709],{"type":60,"value":896},{"type":54,"tag":881,"props":1711,"children":1712},{"style":1181},[1713],{"type":60,"value":1311},{"type":54,"tag":881,"props":1715,"children":1716},{"style":888},[1717],{"type":60,"value":907},{"type":54,"tag":881,"props":1719,"children":1720},{"style":888},[1721],{"type":60,"value":868},{"type":54,"tag":881,"props":1723,"children":1724},{"style":888},[1725],{"type":60,"value":896},{"type":54,"tag":881,"props":1727,"children":1728},{"style":918},[1729],{"type":60,"value":1328},{"type":54,"tag":881,"props":1731,"children":1732},{"style":888},[1733],{"type":60,"value":907},{"type":54,"tag":881,"props":1735,"children":1736},{"style":888},[1737],{"type":60,"value":1337},{"type":54,"tag":881,"props":1739,"children":1740},{"class":883,"line":1340},[1741,1745,1749,1753,1757,1761,1765,1769,1773,1777,1781,1785,1789,1793,1797,1801,1805,1809,1813,1817,1821,1825,1829,1833,1837,1841,1845,1849,1853,1857,1861,1865,1869,1873,1877,1881,1885,1889],{"type":54,"tag":881,"props":1742,"children":1743},{"style":888},[1744],{"type":60,"value":1117},{"type":54,"tag":881,"props":1746,"children":1747},{"style":899},[1748],{"type":60,"value":1047},{"type":54,"tag":881,"props":1750,"children":1751},{"style":888},[1752],{"type":60,"value":907},{"type":54,"tag":881,"props":1754,"children":1755},{"style":888},[1756],{"type":60,"value":868},{"type":54,"tag":881,"props":1758,"children":1759},{"style":888},[1760],{"type":60,"value":1236},{"type":54,"tag":881,"props":1762,"children":1763},{"style":888},[1764],{"type":60,"value":896},{"type":54,"tag":881,"props":1766,"children":1767},{"style":1181},[1768],{"type":60,"value":902},{"type":54,"tag":881,"props":1770,"children":1771},{"style":888},[1772],{"type":60,"value":907},{"type":54,"tag":881,"props":1774,"children":1775},{"style":888},[1776],{"type":60,"value":868},{"type":54,"tag":881,"props":1778,"children":1779},{"style":888},[1780],{"type":60,"value":896},{"type":54,"tag":881,"props":1782,"children":1783},{"style":918},[1784],{"type":60,"value":251},{"type":54,"tag":881,"props":1786,"children":1787},{"style":888},[1788],{"type":60,"value":907},{"type":54,"tag":881,"props":1790,"children":1791},{"style":888},[1792],{"type":60,"value":929},{"type":54,"tag":881,"props":1794,"children":1795},{"style":888},[1796],{"type":60,"value":896},{"type":54,"tag":881,"props":1798,"children":1799},{"style":1181},[1800],{"type":60,"value":938},{"type":54,"tag":881,"props":1802,"children":1803},{"style":888},[1804],{"type":60,"value":907},{"type":54,"tag":881,"props":1806,"children":1807},{"style":888},[1808],{"type":60,"value":868},{"type":54,"tag":881,"props":1810,"children":1811},{"style":888},[1812],{"type":60,"value":951},{"type":54,"tag":881,"props":1814,"children":1815},{"style":888},[1816],{"type":60,"value":907},{"type":54,"tag":881,"props":1818,"children":1819},{"style":918},[1820],{"type":60,"value":262},{"type":54,"tag":881,"props":1822,"children":1823},{"style":888},[1824],{"type":60,"value":907},{"type":54,"tag":881,"props":1826,"children":1827},{"style":888},[1828],{"type":60,"value":968},{"type":54,"tag":881,"props":1830,"children":1831},{"style":888},[1832],{"type":60,"value":896},{"type":54,"tag":881,"props":1834,"children":1835},{"style":1181},[1836],{"type":60,"value":977},{"type":54,"tag":881,"props":1838,"children":1839},{"style":888},[1840],{"type":60,"value":907},{"type":54,"tag":881,"props":1842,"children":1843},{"style":888},[1844],{"type":60,"value":868},{"type":54,"tag":881,"props":1846,"children":1847},{"style":888},[1848],{"type":60,"value":896},{"type":54,"tag":881,"props":1850,"children":1851},{"style":918},[1852],{"type":60,"value":859},{"type":54,"tag":881,"props":1854,"children":1855},{"style":888},[1856],{"type":60,"value":907},{"type":54,"tag":881,"props":1858,"children":1859},{"style":888},[1860],{"type":60,"value":929},{"type":54,"tag":881,"props":1862,"children":1863},{"style":888},[1864],{"type":60,"value":896},{"type":54,"tag":881,"props":1866,"children":1867},{"style":1181},[1868],{"type":60,"value":1010},{"type":54,"tag":881,"props":1870,"children":1871},{"style":888},[1872],{"type":60,"value":907},{"type":54,"tag":881,"props":1874,"children":1875},{"style":888},[1876],{"type":60,"value":868},{"type":54,"tag":881,"props":1878,"children":1879},{"style":888},[1880],{"type":60,"value":896},{"type":54,"tag":881,"props":1882,"children":1883},{"style":918},[1884],{"type":60,"value":1027},{"type":54,"tag":881,"props":1886,"children":1887},{"style":888},[1888],{"type":60,"value":907},{"type":54,"tag":881,"props":1890,"children":1891},{"style":888},[1892],{"type":60,"value":1337},{"type":54,"tag":881,"props":1894,"children":1895},{"class":883,"line":1431},[1896,1900,1904,1908,1912,1916,1920,1924,1928,1932,1936,1940,1944,1948,1952,1956,1960,1964,1968,1972,1976,1980,1984,1989,1993,1997,2003],{"type":54,"tag":881,"props":1897,"children":1898},{"style":888},[1899],{"type":60,"value":1117},{"type":54,"tag":881,"props":1901,"children":1902},{"style":899},[1903],{"type":60,"value":1350},{"type":54,"tag":881,"props":1905,"children":1906},{"style":888},[1907],{"type":60,"value":907},{"type":54,"tag":881,"props":1909,"children":1910},{"style":888},[1911],{"type":60,"value":868},{"type":54,"tag":881,"props":1913,"children":1914},{"style":888},[1915],{"type":60,"value":1174},{"type":54,"tag":881,"props":1917,"children":1918},{"style":888},[1919],{"type":60,"value":896},{"type":54,"tag":881,"props":1921,"children":1922},{"style":1181},[1923],{"type":60,"value":1371},{"type":54,"tag":881,"props":1925,"children":1926},{"style":888},[1927],{"type":60,"value":907},{"type":54,"tag":881,"props":1929,"children":1930},{"style":888},[1931],{"type":60,"value":868},{"type":54,"tag":881,"props":1933,"children":1934},{"style":888},[1935],{"type":60,"value":896},{"type":54,"tag":881,"props":1937,"children":1938},{"style":918},[1939],{"type":60,"value":413},{"type":54,"tag":881,"props":1941,"children":1942},{"style":888},[1943],{"type":60,"value":907},{"type":54,"tag":881,"props":1945,"children":1946},{"style":888},[1947],{"type":60,"value":929},{"type":54,"tag":881,"props":1949,"children":1950},{"style":888},[1951],{"type":60,"value":896},{"type":54,"tag":881,"props":1953,"children":1954},{"style":1181},[1955],{"type":60,"value":1404},{"type":54,"tag":881,"props":1957,"children":1958},{"style":888},[1959],{"type":60,"value":907},{"type":54,"tag":881,"props":1961,"children":1962},{"style":888},[1963],{"type":60,"value":868},{"type":54,"tag":881,"props":1965,"children":1966},{"style":888},[1967],{"type":60,"value":896},{"type":54,"tag":881,"props":1969,"children":1970},{"style":918},[1971],{"type":60,"value":1027},{"type":54,"tag":881,"props":1973,"children":1974},{"style":888},[1975],{"type":60,"value":907},{"type":54,"tag":881,"props":1977,"children":1978},{"style":888},[1979],{"type":60,"value":929},{"type":54,"tag":881,"props":1981,"children":1982},{"style":888},[1983],{"type":60,"value":896},{"type":54,"tag":881,"props":1985,"children":1986},{"style":1181},[1987],{"type":60,"value":1988},"breakdown_limit",{"type":54,"tag":881,"props":1990,"children":1991},{"style":888},[1992],{"type":60,"value":907},{"type":54,"tag":881,"props":1994,"children":1995},{"style":888},[1996],{"type":60,"value":868},{"type":54,"tag":881,"props":1998,"children":2000},{"style":1999},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[2001],{"type":60,"value":2002}," 25",{"type":54,"tag":881,"props":2004,"children":2005},{"style":888},[2006],{"type":60,"value":1210},{"type":54,"tag":881,"props":2008,"children":2009},{"class":883,"line":1490},[2010,2014,2018,2022,2026,2030,2034,2038,2042,2046,2050,2054,2058],{"type":54,"tag":881,"props":2011,"children":2012},{"style":888},[2013],{"type":60,"value":1117},{"type":54,"tag":881,"props":2015,"children":2016},{"style":899},[2017],{"type":60,"value":1441},{"type":54,"tag":881,"props":2019,"children":2020},{"style":888},[2021],{"type":60,"value":907},{"type":54,"tag":881,"props":2023,"children":2024},{"style":888},[2025],{"type":60,"value":868},{"type":54,"tag":881,"props":2027,"children":2028},{"style":888},[2029],{"type":60,"value":1174},{"type":54,"tag":881,"props":2031,"children":2032},{"style":888},[2033],{"type":60,"value":896},{"type":54,"tag":881,"props":2035,"children":2036},{"style":1181},[2037],{"type":60,"value":1462},{"type":54,"tag":881,"props":2039,"children":2040},{"style":888},[2041],{"type":60,"value":907},{"type":54,"tag":881,"props":2043,"children":2044},{"style":888},[2045],{"type":60,"value":868},{"type":54,"tag":881,"props":2047,"children":2048},{"style":888},[2049],{"type":60,"value":896},{"type":54,"tag":881,"props":2051,"children":2052},{"style":918},[2053],{"type":60,"value":1479},{"type":54,"tag":881,"props":2055,"children":2056},{"style":888},[2057],{"type":60,"value":907},{"type":54,"tag":881,"props":2059,"children":2060},{"style":888},[2061],{"type":60,"value":1036},{"type":54,"tag":881,"props":2063,"children":2065},{"class":883,"line":2064},8,[2066],{"type":54,"tag":881,"props":2067,"children":2068},{"style":888},[2069],{"type":60,"value":1496},{"type":54,"tag":184,"props":2071,"children":2073},{"id":2072},"measure-ai-agent-traffic-specifically",[2074],{"type":60,"value":2075},"Measure AI-agent traffic specifically",{"type":54,"tag":63,"props":2077,"children":2078},{},[2079,2081,2086,2087,2092,2093,2098,2100,2105],{"type":60,"value":2080},"Filter ",{"type":54,"tag":196,"props":2082,"children":2084},{"className":2083},[],[2085],{"type":60,"value":276},{"type":60,"value":853},{"type":54,"tag":196,"props":2088,"children":2090},{"className":2089},[],[2091],{"type":60,"value":859},{"type":60,"value":853},{"type":54,"tag":196,"props":2094,"children":2096},{"className":2095},[],[2097],{"type":60,"value":293},{"type":60,"value":2099},", break down by ",{"type":54,"tag":196,"props":2101,"children":2103},{"className":2102},[],[2104],{"type":60,"value":450},{"type":60,"value":2106}," to see\nwhich tools (OpenAI, Anthropic, Perplexity, …) read your site and which pages they hit.",{"type":54,"tag":184,"props":2108,"children":2110},{"id":2109},"raw-sql-equivalents",[2111],{"type":60,"value":2112},"Raw SQL equivalents",{"type":54,"tag":870,"props":2114,"children":2118},{"className":2115,"code":2116,"language":2117,"meta":875,"style":875},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- human pageviews only\nSELECT count() AS human_pageviews\nFROM events\nWHERE event = '$pageview'\n    AND NOT isLikelyBot(coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent))\n\n-- top bots by hits\nSELECT\n    getBotName(coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent)) AS bot,\n    getBotOperator(coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent)) AS operator,\n    count() AS hits\nFROM events\nWHERE event = '$pageview'\n    AND isLikelyBot(coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent))\nGROUP BY bot, operator\nORDER BY hits DESC\n","sql",[2119],{"type":54,"tag":196,"props":2120,"children":2121},{"__ignoreMap":875},[2122,2130,2138,2146,2154,2162,2171,2179,2187,2196,2205,2214,2222,2230,2239,2248],{"type":54,"tag":881,"props":2123,"children":2124},{"class":883,"line":884},[2125],{"type":54,"tag":881,"props":2126,"children":2127},{},[2128],{"type":60,"value":2129},"-- human pageviews only\n",{"type":54,"tag":881,"props":2131,"children":2132},{"class":883,"line":1111},[2133],{"type":54,"tag":881,"props":2134,"children":2135},{},[2136],{"type":60,"value":2137},"SELECT count() AS human_pageviews\n",{"type":54,"tag":881,"props":2139,"children":2140},{"class":883,"line":1151},[2141],{"type":54,"tag":881,"props":2142,"children":2143},{},[2144],{"type":60,"value":2145},"FROM events\n",{"type":54,"tag":881,"props":2147,"children":2148},{"class":883,"line":1213},[2149],{"type":54,"tag":881,"props":2150,"children":2151},{},[2152],{"type":60,"value":2153},"WHERE event = '$pageview'\n",{"type":54,"tag":881,"props":2155,"children":2156},{"class":883,"line":1340},[2157],{"type":54,"tag":881,"props":2158,"children":2159},{},[2160],{"type":60,"value":2161},"    AND NOT isLikelyBot(coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent))\n",{"type":54,"tag":881,"props":2163,"children":2164},{"class":883,"line":1431},[2165],{"type":54,"tag":881,"props":2166,"children":2168},{"emptyLinePlaceholder":2167},true,[2169],{"type":60,"value":2170},"\n",{"type":54,"tag":881,"props":2172,"children":2173},{"class":883,"line":1490},[2174],{"type":54,"tag":881,"props":2175,"children":2176},{},[2177],{"type":60,"value":2178},"-- top bots by hits\n",{"type":54,"tag":881,"props":2180,"children":2181},{"class":883,"line":2064},[2182],{"type":54,"tag":881,"props":2183,"children":2184},{},[2185],{"type":60,"value":2186},"SELECT\n",{"type":54,"tag":881,"props":2188,"children":2190},{"class":883,"line":2189},9,[2191],{"type":54,"tag":881,"props":2192,"children":2193},{},[2194],{"type":60,"value":2195},"    getBotName(coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent)) AS bot,\n",{"type":54,"tag":881,"props":2197,"children":2199},{"class":883,"line":2198},10,[2200],{"type":54,"tag":881,"props":2201,"children":2202},{},[2203],{"type":60,"value":2204},"    getBotOperator(coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent)) AS operator,\n",{"type":54,"tag":881,"props":2206,"children":2208},{"class":883,"line":2207},11,[2209],{"type":54,"tag":881,"props":2210,"children":2211},{},[2212],{"type":60,"value":2213},"    count() AS hits\n",{"type":54,"tag":881,"props":2215,"children":2217},{"class":883,"line":2216},12,[2218],{"type":54,"tag":881,"props":2219,"children":2220},{},[2221],{"type":60,"value":2145},{"type":54,"tag":881,"props":2223,"children":2225},{"class":883,"line":2224},13,[2226],{"type":54,"tag":881,"props":2227,"children":2228},{},[2229],{"type":60,"value":2153},{"type":54,"tag":881,"props":2231,"children":2233},{"class":883,"line":2232},14,[2234],{"type":54,"tag":881,"props":2235,"children":2236},{},[2237],{"type":60,"value":2238},"    AND isLikelyBot(coalesce(nullIf(properties.$raw_user_agent, ''), properties.$user_agent))\n",{"type":54,"tag":881,"props":2240,"children":2242},{"class":883,"line":2241},15,[2243],{"type":54,"tag":881,"props":2244,"children":2245},{},[2246],{"type":60,"value":2247},"GROUP BY bot, operator\n",{"type":54,"tag":881,"props":2249,"children":2251},{"class":883,"line":2250},16,[2252],{"type":54,"tag":881,"props":2253,"children":2254},{},[2255],{"type":60,"value":2256},"ORDER BY hits DESC\n",{"type":54,"tag":107,"props":2258,"children":2260},{"id":2259},"seeing-bots-that-dont-run-javascript",[2261],{"type":60,"value":2262},"Seeing bots that don't run JavaScript",{"type":54,"tag":63,"props":2264,"children":2265},{},[2266,2268,2274,2276,2281,2283,2289,2291,2296,2298,2303,2305,2310],{"type":60,"value":2267},"Most crawlers and AI agents never execute JS, so ",{"type":54,"tag":196,"props":2269,"children":2271},{"className":2270},[],[2272],{"type":60,"value":2273},"posthog-js",{"type":60,"value":2275}," never fires a ",{"type":54,"tag":196,"props":2277,"children":2279},{"className":2278},[],[2280],{"type":60,"value":1294},{"type":60,"value":2282}," for\nthem — they're invisible to client-side analytics. To measure them, the project must forward\nserver access logs as ",{"type":54,"tag":196,"props":2284,"children":2286},{"className":2285},[],[2287],{"type":60,"value":2288},"$http_log",{"type":60,"value":2290}," events carrying ",{"type":54,"tag":196,"props":2292,"children":2294},{"className":2293},[],[2295],{"type":60,"value":201},{"type":60,"value":2297},". If a user asks \"why\ndon't I see GPTBot when I know it's crawling us?\", the answer is almost always: no ",{"type":54,"tag":196,"props":2299,"children":2301},{"className":2300},[],[2302],{"type":60,"value":2288},{"type":60,"value":2304},"\ningestion. Point them at server-side capture (the ",{"type":54,"tag":99,"props":2306,"children":2307},{},[2308],{"type":60,"value":2309},"Vercel logs",{"type":60,"value":2311}," source, an edge worker, or\nthe capture API) before building bot insights.",{"type":54,"tag":107,"props":2313,"children":2315},{"id":2314},"gotchas",[2316],{"type":60,"value":2317},"Gotchas",{"type":54,"tag":69,"props":2319,"children":2320},{},[2321,2365,2381,2418,2443],{"type":54,"tag":73,"props":2322,"children":2323},{},[2324,2329,2331,2336,2337,2342,2344,2350,2352,2357,2358,2363],{"type":54,"tag":99,"props":2325,"children":2326},{},[2327],{"type":60,"value":2328},"Needs a captured user agent.",{"type":60,"value":2330}," Classification is computed at query time from the event's\n",{"type":54,"tag":196,"props":2332,"children":2334},{"className":2333},[],[2335],{"type":60,"value":201},{"type":60,"value":596},{"type":54,"tag":196,"props":2338,"children":2340},{"className":2339},[],[2341],{"type":60,"value":209},{"type":60,"value":2343},", so it works on any historical event — there's no need to\nrestrict ",{"type":54,"tag":196,"props":2345,"children":2347},{"className":2346},[],[2348],{"type":60,"value":2349},"dateRange.date_from",{"type":60,"value":2351},". The one requirement is that a user agent was captured; events\nfrom sources that never set one can't be classified (and empty UAs fall through to\n",{"type":54,"tag":196,"props":2353,"children":2355},{"className":2354},[],[2356],{"type":60,"value":308},{"type":60,"value":596},{"type":54,"tag":196,"props":2359,"children":2361},{"className":2360},[],[2362],{"type":60,"value":394},{"type":60,"value":2364},", below).",{"type":54,"tag":73,"props":2366,"children":2367},{},[2368,2379],{"type":54,"tag":99,"props":2369,"children":2370},{},[2371,2377],{"type":54,"tag":196,"props":2372,"children":2374},{"className":2373},[],[2375],{"type":60,"value":2376},"isLikelyBot",{"type":60,"value":2378}," is \"likely\".",{"type":60,"value":2380}," Detection is a user-agent heuristic — some bots spoof\nreal browser UAs, and some legit tools use bot-like ones. Treat it as best-effort, not\nground truth.",{"type":54,"tag":73,"props":2382,"children":2383},{},[2384,2389,2391,2396,2397,2402,2404,2409,2411,2416],{"type":54,"tag":99,"props":2385,"children":2386},{},[2387],{"type":60,"value":2388},"Empty user agent = bot.",{"type":60,"value":2390}," Requests with no UA (server-to-server, misconfigured SDKs)\nclassify as ",{"type":54,"tag":196,"props":2392,"children":2394},{"className":2393},[],[2395],{"type":60,"value":308},{"type":60,"value":596},{"type":54,"tag":196,"props":2398,"children":2400},{"className":2399},[],[2401],{"type":60,"value":394},{"type":60,"value":2403},", so ",{"type":54,"tag":196,"props":2405,"children":2407},{"className":2406},[],[2408],{"type":60,"value":2376},{"type":60,"value":2410}," returns ",{"type":54,"tag":196,"props":2412,"children":2414},{"className":2413},[],[2415],{"type":60,"value":262},{"type":60,"value":2417},".",{"type":54,"tag":73,"props":2419,"children":2420},{},[2421,2426,2428,2434,2436,2441],{"type":54,"tag":99,"props":2422,"children":2423},{},[2424],{"type":60,"value":2425},"Don't silently drop the host filter.",{"type":60,"value":2427}," If the user is scoped to one domain, inherit\n",{"type":54,"tag":196,"props":2429,"children":2431},{"className":2430},[],[2432],{"type":60,"value":2433},"$host",{"type":60,"value":2435}," in ",{"type":54,"tag":196,"props":2437,"children":2439},{"className":2438},[],[2440],{"type":60,"value":1047},{"type":60,"value":2442}," — leaving it out changes the answer.",{"type":54,"tag":73,"props":2444,"children":2445},{},[2446,2451],{"type":54,"tag":99,"props":2447,"children":2448},{},[2449],{"type":60,"value":2450},"Bot definitions evolve.",{"type":60,"value":2452}," The detected-bot list changes over time, so re-running the\nsame query later can classify older events differently.",{"type":54,"tag":2454,"props":2455,"children":2456},"style",{},[2457],{"type":60,"value":2458},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2460,"total":2624},[2461,2474,2486,2498,2511,2526,2541,2557,2571,2586,2596,2614],{"slug":2462,"name":2462,"fn":2463,"description":2464,"org":2465,"tags":2466,"stars":23,"repoUrl":24,"updatedAt":2473},"analyzing-expensive-users","analyze expensive users in AI observability","Analyze the most expensive users in AI observability and explain why they cost so much. Use when the user asks about top spenders, expensive users, per-user LLM cost, user-level cost drivers, or patterns behind high AI observability spend.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2467,2468,2471,2472],{"name":21,"slug":22,"type":15},{"name":2469,"slug":2470,"type":15},"Cost Optimization","cost-optimization",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-07-28T05:34:11.117757",{"slug":2475,"name":2475,"fn":2476,"description":2477,"org":2478,"tags":2479,"stars":23,"repoUrl":24,"updatedAt":2485},"auditing-endpoints","audit PostHog project endpoints","Audit every endpoint in a PostHog project for staleness, failed materialisations, and unused materialised versions. Use when the user asks \"what endpoints can I clean up?\", \"are any of my endpoints broken?\", \"which materialised versions are still being called?\", or wants a one-shot cleanup pass over the Endpoints product. Produces a prioritised report grouped by issue type, with recommended actions but does not modify anything without explicit confirmation.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2480,2481,2484],{"name":21,"slug":22,"type":15},{"name":2482,"slug":2483,"type":15},"Audit","audit",{"name":9,"slug":8,"type":15},"2026-06-08T08:08:33.693989",{"slug":2487,"name":2487,"fn":2488,"description":2489,"org":2490,"tags":2491,"stars":23,"repoUrl":24,"updatedAt":2497},"auditing-warehouse-source-health","audit PostHog data warehouse source health","Audit the health of a PostHog project's data warehouse sources and syncs — find every broken or degraded source connection, sync schema, and webhook channel. Use when the user asks \"why are my imports failing?\", \"what's broken with my sources?\", \"why is my warehouse data stale?\", or wants a one-shot triage of source\u002Fsync health before deciding where to dig in. Produces a prioritized report grouped by severity, with recommended next steps. For materialized-view health use `auditing-warehouse-view-health`; for a single failing sync use `diagnosing-failed-warehouse-syncs`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2492,2493,2495,2496],{"name":2482,"slug":2483,"type":15},{"name":2494,"slug":32,"type":15},"Data Warehouse",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-06-18T08:22:57.67984",{"slug":2499,"name":2499,"fn":2500,"description":2501,"org":2502,"tags":2503,"stars":23,"repoUrl":24,"updatedAt":2510},"auditing-warehouse-view-health","audit PostHog materialized view health","Audit the health of a PostHog project's materialized views (saved queries) — find every failed materialization and flag unused or stale materialized views that cost storage and compute. Use when the user asks \"which of my views are broken?\", \"why is this materialized view failing?\", \"are any of my views wasting compute?\", or wants a one-shot triage of view health. For source\u002Fsync health use `auditing-warehouse-source-health`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2504,2505,2506,2509],{"name":2482,"slug":2483,"type":15},{"name":2494,"slug":32,"type":15},{"name":2507,"slug":2508,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},"2026-06-18T08:25:10.936787",{"slug":2512,"name":2512,"fn":2513,"description":2514,"org":2515,"tags":2516,"stars":23,"repoUrl":24,"updatedAt":2525},"authoring-error-tracking-alerts","author PostHog error tracking alerts","Author error tracking alerts that fire when an issue is created, reopened, or starts spiking. Use when the user asks to set up error notifications, route exceptions to Slack\u002Fwebhook\u002FLinear, or evaluate which error events are worth alerting on. Covers trigger-event selection, integration choice, dedup against existing alerts, and shipping with the canonical message body shape.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2517,2520,2523,2524],{"name":2518,"slug":2519,"type":15},"Alerting","alerting",{"name":2521,"slug":2522,"type":15},"Debugging","debugging",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-06-18T08:24:40.318583",{"slug":2527,"name":2527,"fn":2528,"description":2529,"org":2530,"tags":2531,"stars":23,"repoUrl":24,"updatedAt":2540},"authoring-log-alerts","author log alerts in PostHog","Author useful, low-noise log alerts on services in a PostHog project. Use when the user asks to set up alerts for their logs, suggest alerts they should add, or evaluate whether a service is worth monitoring. Covers service triage, baseline characterisation, threshold drafting, back-testing via simulate, and shipping with a notification destination.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2532,2533,2535,2536,2539],{"name":21,"slug":22,"type":15},{"name":2534,"slug":373,"type":15},"Monitoring",{"name":13,"slug":14,"type":15},{"name":2537,"slug":2538,"type":15},"Operations","operations",{"name":9,"slug":8,"type":15},"2026-07-18T05:10:54.430898",{"slug":2542,"name":2542,"fn":2543,"description":2544,"org":2545,"tags":2546,"stars":23,"repoUrl":24,"updatedAt":2556},"building-workflows","build and edit PostHog workflows","Build, edit, test, enable, and monitor PostHog workflows over MCP. Author the action\u002Fedge graph so it runs and opens cleanly in the visual editor, then change drafts surgically with patch operations. Use when asked to build, set up, automate, change, fix, or debug a workflow, campaign, broadcast, drip sequence, or event-triggered automation in the workflows product.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2547,2549,2552,2553],{"name":308,"slug":2548,"type":15},"automation",{"name":2550,"slug":2551,"type":15},"MCP","mcp",{"name":9,"slug":8,"type":15},{"name":2554,"slug":2555,"type":15},"Workflow Automation","workflow-automation","2026-07-28T05:34:12.167015",{"slug":2558,"name":2558,"fn":2559,"description":2560,"org":2561,"tags":2562,"stars":23,"repoUrl":24,"updatedAt":2570},"check-posthog-loading","inspect PostHog SDK loading across URLs","Inspect how the PostHog JavaScript SDK is loaded across a list of URLs. Use to confirm consistent installation across pages, find pages missing the snippet, detect mismatched API keys or hosts between pages, and verify the load method (head snippet vs deferred vs array.js).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2563,2564,2565,2568,2569],{"name":21,"slug":22,"type":15},{"name":2521,"slug":2522,"type":15},{"name":2566,"slug":2567,"type":15},"Frontend","frontend",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-05-07T05:56:19.828048",{"slug":2572,"name":2572,"fn":2573,"description":2574,"org":2575,"tags":2576,"stars":23,"repoUrl":24,"updatedAt":2585},"consuming-endpoints-from-client-code","integrate PostHog endpoints into client applications","Wire a PostHog endpoint into a client app or SDK. Covers fetching the OpenAPI spec, generating a typed client with openapi-generator or @hey-api\u002Fopenapi-ts, sending the right auth header, shaping the variables payload (HogQL code_name vs insight breakdown property), handling rate-limit and materialised-endpoint error responses. Use when the user says \"how do I call my endpoint\", \"generate a client for this\", or \"what auth header do I use\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2577,2580,2581,2582],{"name":2578,"slug":2579,"type":15},"API Development","api-development",{"name":2566,"slug":2567,"type":15},{"name":9,"slug":8,"type":15},{"name":2583,"slug":2584,"type":15},"SDK","sdk","2026-06-08T08:08:34.929454",{"slug":2587,"name":2587,"fn":2588,"description":2589,"org":2590,"tags":2591,"stars":23,"repoUrl":24,"updatedAt":2595},"copying-endpoints-across-projects","copy PostHog endpoints across projects","Copy a PostHog endpoint (a saved HogQL\u002Finsight query exposed as an API route) to another project in the same organization, or duplicate it under a new name in the same project. Use when the user wants to duplicate an endpoint, promote an endpoint from staging to production, replicate an endpoint's query\u002Fvariables\u002Ffreshness config in another workspace, or clone an endpoint to iterate on it. Unlike feature flags and experiments, endpoints have NO native cross-project copy tool — this skill covers the read-then-recreate flow (endpoint-get then endpoint-create), the active-project switching it requires, name-collision checks, and the safe defaults (land unmaterialised in the target, verify with endpoint-run). Does not cover editing endpoint versions (see managing-endpoint-versions) or authoring a brand-new endpoint from scratch (see creating-an-endpoint).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2592,2593,2594],{"name":2578,"slug":2579,"type":15},{"name":2537,"slug":2538,"type":15},{"name":9,"slug":8,"type":15},"2026-07-15T05:29:58.442727",{"slug":2597,"name":2597,"fn":2598,"description":2599,"org":2600,"tags":2601,"stars":23,"repoUrl":24,"updatedAt":2613},"creating-ai-subscription","schedule recurring AI-generated PostHog reports","Create a recurring AI-generated PostHog report — schedule a free-text prompt to run on a cron, with the LLM-synthesized markdown delivered to email or Slack on each tick. Use when the user wants a recurring AI summary of X on any cadence (daily, weekly, monthly, yearly) rather than a one-off report. (To attach an AI summary to an existing insight\u002Fdashboard subscription instead of a free-text prompt, see `managing-subscriptions` and its `summary_enabled` option.)\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2602,2603,2606,2607,2610],{"name":308,"slug":2548,"type":15},{"name":2604,"slug":2605,"type":15},"Email","email",{"name":9,"slug":8,"type":15},{"name":2608,"slug":2609,"type":15},"Reporting","reporting",{"name":2611,"slug":2612,"type":15},"Slack","slack","2026-06-09T07:32:27.935712",{"slug":2615,"name":2615,"fn":2616,"description":2617,"org":2618,"tags":2619,"stars":23,"repoUrl":24,"updatedAt":2623},"creating-an-endpoint","create PostHog API endpoints","Create a PostHog endpoint with the right shape on the first try — covers query kind choice, name conventions, what to expose as variables (HogQL code_name vs insight breakdown), data_freshness_seconds, and whether to materialise on day one. Use when the user says \"create an endpoint\", \"expose this query as an API\", \"turn this insight into an endpoint\", or asks for help structuring a new endpoint. Steers away from common mistakes: materialising a query with cohort breakdowns or compare mode, inline-only variables on a materialised endpoint, unbounded date ranges, ambiguous names.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2620,2621,2622],{"name":21,"slug":22,"type":15},{"name":2578,"slug":2579,"type":15},{"name":9,"slug":8,"type":15},"2026-06-08T08:08:29.624498",231,{"items":2626,"total":2676},[2627,2634,2640,2647,2654,2661,2669],{"slug":2462,"name":2462,"fn":2463,"description":2464,"org":2628,"tags":2629,"stars":23,"repoUrl":24,"updatedAt":2473},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2630,2631,2632,2633],{"name":21,"slug":22,"type":15},{"name":2469,"slug":2470,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":2475,"name":2475,"fn":2476,"description":2477,"org":2635,"tags":2636,"stars":23,"repoUrl":24,"updatedAt":2485},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2637,2638,2639],{"name":21,"slug":22,"type":15},{"name":2482,"slug":2483,"type":15},{"name":9,"slug":8,"type":15},{"slug":2487,"name":2487,"fn":2488,"description":2489,"org":2641,"tags":2642,"stars":23,"repoUrl":24,"updatedAt":2497},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2643,2644,2645,2646],{"name":2482,"slug":2483,"type":15},{"name":2494,"slug":32,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":2499,"name":2499,"fn":2500,"description":2501,"org":2648,"tags":2649,"stars":23,"repoUrl":24,"updatedAt":2510},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2650,2651,2652,2653],{"name":2482,"slug":2483,"type":15},{"name":2494,"slug":32,"type":15},{"name":2507,"slug":2508,"type":15},{"name":9,"slug":8,"type":15},{"slug":2512,"name":2512,"fn":2513,"description":2514,"org":2655,"tags":2656,"stars":23,"repoUrl":24,"updatedAt":2525},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2657,2658,2659,2660],{"name":2518,"slug":2519,"type":15},{"name":2521,"slug":2522,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":2527,"name":2527,"fn":2528,"description":2529,"org":2662,"tags":2663,"stars":23,"repoUrl":24,"updatedAt":2540},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2664,2665,2666,2667,2668],{"name":21,"slug":22,"type":15},{"name":2534,"slug":373,"type":15},{"name":13,"slug":14,"type":15},{"name":2537,"slug":2538,"type":15},{"name":9,"slug":8,"type":15},{"slug":2542,"name":2542,"fn":2543,"description":2544,"org":2670,"tags":2671,"stars":23,"repoUrl":24,"updatedAt":2556},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2672,2673,2674,2675],{"name":308,"slug":2548,"type":15},{"name":2550,"slug":2551,"type":15},{"name":9,"slug":8,"type":15},{"name":2554,"slug":2555,"type":15},61]