{"id":8816,"date":"2026-08-05T15:36:55","date_gmt":"2026-08-05T13:36:55","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=8816"},"modified":"2026-10-20T15:01:43","modified_gmt":"2026-10-20T13:01:43","slug":"ga4-bot-detector","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-bot-detector\/","title":{"rendered":"GA4 Bot Detector"},"content":{"rendered":"<link rel=\"stylesheet\" href=\"\/blog\/wp-content\/themes\/lw-theme\/js\/analytics-workbench.css?v=20260927a\">\n<div id=\"lw-analytics-workbench\" data-kind=\"traffic\" data-rc-private data-mp-mask><\/div>\n<p><script type=\"application\/json\" id=\"lw-analytics-config\">{\"client\": \"Public OAuth Web client ID\", \"quota\": \"Quota project ID (optional)\", \"loadLogin\": \"Load Google login\", \"login\": \"Sign in with Google\", \"disconnect\": \"Disconnect and clear\", \"cancel\": \"Cancel\", \"loading\": \"Loading\u2026\", \"done\": \"Completed.\", \"loginReady\": \"Login loaded. Click Sign in with Google.\", \"loginWaiting\": \"Waiting for Google. Allow popups or use a regular browser tab.\", \"connected\": \"Connected with read-only access.\", \"popup\": \"Google login was closed or blocked.\", \"authError\": \"Login missing, expired or permission not granted.\", \"clientInvalid\": \"A Web application client ID is required, not a project ID or secret.\", \"setupTitle\": \"OAuth setup and limits\", \"setup\": \"The prefilled Web OAuth client can be replaced. An own client needs https:\/\/www.lukaswojcik.com as an authorized JavaScript origin, Analytics Data API and a configured consent screen. Only analytics.readonly is requested, with no cloud-platform or AI permission. The optional quota project requires appropriate access. Cancellation stops local waiting; Google may continue processing an accepted request.\", \"privacyOAuth\": \"Google login loads only on click. API calls go directly from this browser to Google. Tokens and reports stay in tab memory; no report proxy or browser storage is used. Tracking, session recording and chat are disabled here. Normal website access logs remain. Explicit CSV downloads stay on the device.\", \"property\": \"Numeric GA4 property ID\", \"start\": \"Start date\", \"end\": \"End date\", \"demo\": \"Try invented example\", \"demoTitle\": \"Invented example\", \"demoNotice\": \"Example data only. No Google request was sent.\", \"sessions\": \"Sessions\", \"findings\": \"Review flags\", \"noFlag\": \"No rule matched\", \"metadata\": \"API metadata and quota\", \"export\": \"Download reported groups as CSV\", \"previewLimit\": \"Preview limited to 500 rows; download contains all rows.\", \"cancelled\": \"Cancelled or timed out. No automatic retry.\", \"error\": \"Could not process the data. Check file format, permissions and API availability.\", \"errors\": {\"date\": \"Use completed dates before today, in order, spanning at most 93 calendar days. Check the property timezone.\", \"property\": \"Use a numeric property ID, not a G- measurement ID.\", \"schema\": \"Unexpected or incomplete response schema. No result produced.\", \"duplicate\": \"Duplicate matching keys; no reliable comparison is possible.\", \"number\": \"Invalid or unsupported metric value. No partial comparison produced.\", \"snapshot\": \"Invalid snapshot format, unknown version or ambiguous keys.\", \"limit\": \"Row limit exceeded or pagination changed. No partial result is presented.\", \"size\": \"File exceeds 5 MB, 20,000 CSV rows or 100 columns.\", \"csv\": \"Invalid CSV: check separator, quoting, unique headers and column counts.\", \"empty\": \"No data rows found.\", \"mapping\": \"Assign three different columns per file.\", \"id\": \"Missing\/reserved ID, surrounding whitespace or invalid currency code.\", \"files\": \"Load both CSV files first.\", \"basis\": \"Confirm the common comparison basis first.\", \"needSnapshots\": \"Two valid snapshots are required.\", \"auth\": \"Login missing, expired or permission not granted.\", \"sdk\": \"Google login could not be loaded.\", \"quota\": \"Invalid quota project ID.\", \"http400\": \"Google rejected the request (400). Check dimensions, property and dates.\", \"http401\": \"Login missing, expired or permission not granted.\", \"http403\": \"Google denied access (403). Check enabled APIs, property access and the optional quota project.\", \"http429\": \"Google quota exceeded (429). Retry later.\", \"threshold\": \"Choose an integer from 1 to 10,000.\"}, \"locale\": \"en\", \"scan\": \"Review traffic groups\", \"method\": \"Read reported groups by browser, operating system, country and session source\/medium. Default minimum: 20 sessions per row, a configurable review threshold, not statistical significance. Up to 93 calendar days and 10,000 rows. No automatic exclusions or changes to Analytics.\", \"interpretation\": \"These are review cues, not bot probabilities or verified bot sessions. Zero engaged sessions and zero average duration can share causes and are not independent evidence. Missing fields can reflect collection or reporting limits. The browser-name cue matches headless, phantomjs, selenium, puppeteer or playwright; a name alone does not verify automation. Country and Direct are context only. Compare server\/CDN logs and known QA activity before drawing conclusions. Known bots may already be excluded by Google; the excluded count cannot be recovered here. Metadata may reveal thresholding, sampling or aggregated rows; absence of a warning does not establish completeness.\", \"screenPageViews\": \"Page \/ screen views\", \"minimum\": \"Minimum reported sessions per row (1\u201310,000)\", \"summary\": \"Returned rows \/ sum of reported sessions \/ rows with cues \/ rows below minimum\", \"emptyReport\": \"No rows returned. This does not establish the absence of traffic or bots.\", \"noMatches\": \"No rule matched at this minimum. This does not establish that the property is free of bots.\", \"belowMinimum\": \"Below review minimum; not classified\", \"zeroEngaged\": \"No engaged sessions reported\", \"zeroDuration\": \"Average session duration reported as zero\", \"missingDimension\": \"Missing or aggregated dimension\", \"automationLabel\": \"Automation-related term in browser name\", \"browser\": \"Browser\", \"operatingSystem\": \"Operating system\", \"country\": \"Country\", \"sessionSourceMedium\": \"Session source \/ medium\", \"engagedSessions\": \"Engaged sessions\", \"averageSessionDuration\": \"Average session duration (seconds)\"}<\/script><script src=\"\/blog\/wp-content\/themes\/lw-theme\/js\/analytics-workbench-core.js?v=20260927a\"><\/script><script src=\"\/blog\/wp-content\/themes\/lw-theme\/js\/traffic-core.js?v=20260928a\"><\/script><script src=\"\/blog\/wp-content\/themes\/lw-theme\/js\/traffic-ui.js?v=20261020\"><\/script><\/p>\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/support.google.com\/analytics\/answer\/9888366?hl=en\">Google: Known bot exclusion<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/reporting\/data\/v1\/api-schema\">Google: Data API schema<\/a><\/li>\n<\/ul>\n<h2>Related practical articles<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/cloud-ai\/bot-detection-ip-lists-and-cryptographic-signatures-compared\/\">Bot Detection: IP Lists and Cryptographic Signatures Compared<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Reviews reported GA4 traffic groups using explicit cues. No bot probabilities or identity verification. Read-only Google access and CSV export.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[91297,91258],"class_list":["post-8816","page","type-page","status-publish","hentry","tag-data-quality","tag-google-analytics-4"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>GA4 Bot Detector | Lukas Wojcik<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-bot-detector\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GA4 Bot Detector | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Reviews reported GA4 traffic groups using explicit cues. No bot probabilities or identity verification. Read-only Google access and CSV export.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-bot-detector\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-20T13:01:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-bot-detector\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-bot-detector\\\/\",\"name\":\"GA4 Bot Detector | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-05T13:36:55+00:00\",\"dateModified\":\"2026-10-20T13:01:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-bot-detector\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-bot-detector\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-bot-detector\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"GA4 Bot Detector\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"GA4 Bot Detector | Lukas Wojcik","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-bot-detector\/","og_locale":"en_US","og_type":"article","og_title":"GA4 Bot Detector | Lukas Wojcik","og_description":"Reviews reported GA4 traffic groups using explicit cues. No bot probabilities or identity verification. Read-only Google access and CSV export.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-bot-detector\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-10-20T13:01:43+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-bot-detector\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-bot-detector\/","name":"GA4 Bot Detector | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-05T13:36:55+00:00","dateModified":"2026-10-20T13:01:43+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-bot-detector\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-bot-detector\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-bot-detector\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"GA4 Bot Detector"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/8816","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=8816"}],"version-history":[{"count":9,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/8816\/revisions"}],"predecessor-version":[{"id":20835,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/8816\/revisions\/20835"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=8816"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=8816"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}