{"id":379780,"date":"2026-10-09T13:17:49","date_gmt":"2026-10-09T13:17:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/geo-insights-ai-search-visibility-stats\/"},"modified":"2026-10-09T16:06:12","modified_gmt":"2026-10-09T16:06:12","slug":"wille-geo-ai-visibility","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/wille-geo-ai-visibility\/","author":23578425,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.4.0","stable_tag":"2.4.0","tested":"7.1.3","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Wille GEO \u2013 AI Crawler Stats, llms.txt & AI Visibility","header_author":"Lucas Wille","header_description":"See which AI (ChatGPT, Claude, Perplexity \u2026) reads which of your pages \u2013 and optimize your site for AI search (GEO). Free, no personal data.","assets_banners_color":"7e7cb6","last_updated":"2026-10-09 16:06:12","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/lcswll\/wordpress-geo","header_author_uri":"https:\/\/lucaswille.de\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":65,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.3.1":{"tag":"2.3.1","author":"lcswll","date":"2026-10-09 13:17:16","revision":3736719},"2.3.2":{"tag":"2.3.2","author":"lcswll","date":"2026-10-09 14:19:06","revision":3736843},"2.4.0":{"tag":"2.4.0","author":"lcswll","date":"2026-10-09 16:06:12","revision":3737037}},"upgrade_notice":{"2.4.0":"<p>Results right after activation and a notice for the first AI visit. Settings and statistics are kept.<\/p>","2.3.2":"<p>No code changes \u2013 Live Preview and readme update.<\/p>","2.3.1":"<p>Escaped output for the Markdown and llms.txt endpoints, further hardening.<\/p>","2.3.0":"<p>New plugin name, hardened JSON-LD and beacon, PHP 7.4 fix. Settings and statistics are kept.<\/p>","2.2.0":"<p>Redesigned admin screens with navigation between all Wille GEO pages.<\/p>","2.1.0":"<p>Requires WordPress 6.5+. Hardened database queries and translation loading; no settings change needed.<\/p>","1.4.0":"<p>The statistics dashboard is now a modern interactive React app (Recharts, bundled locally \u2013 no CDN), fed by a new admin-only REST endpoint.<\/p>","1.3.0":"<p>Weekly email report, IndexNow instant indexing, cache-proof AI visitor counting, WP-CLI, plain-language explainer page, Google\/Microsoft bot verification, 8 new crawlers.<\/p>","1.2.0":"<p>Important fix for bot verification behind CDNs\/proxies, Unicode word counts, llms.txt key content, sameAs profiles.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.gif":{"filename":"icon-128x128.gif","revision":3736719,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.gif":{"filename":"icon-256x256.gif","revision":3736719,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3736719,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3736719,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3737039,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=wille-geo\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"features\":{\"networking\":true},\"login\":true,\"steps\":[{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"Wille GEO Demo\",\"blogdescription\":\"Guides about WordPress and AI search\",\"permalink_structure\":\"\\\/%postname%\\\/\"}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"wille-geo-ai-visibility\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php\\n\\\/**\\n * Seeds WordPress for the browser tests and the directory screenshots: three posts\\\/pages with focus terms,\\n * an author bio, the opt-in features switched on and 90 days of plausible AI traffic (raw hits for the last\\n * 7 days, daily aggregates before that \\u2013 the same split the plugin's own rollup produces).\\n *\\n * Writes \\\/e2e-out\\\/seeded last (tests\\\/e2e\\\/wait-for-wordpress.js waits for it).\\n *\\n * @package Wille_GEO\\n *\\\/\\n\\nrequire '\\\/wordpress\\\/wp-load.php';\\n\\nglobal $wpdb;\\n\\n$ids   = array();\\n$ids[] = wp_insert_post(\\n\\tarray(\\n\\t\\t'post_title'   => 'WordPress Backup Guide',\\n\\t\\t'post_name'    => 'wordpress-backup-guide',\\n\\t\\t'post_status'  => 'publish',\\n\\t\\t'post_type'    => 'post',\\n\\t\\t'post_author'  => 1,\\n\\t\\t'post_content' => '<p>A WordPress backup plugin copies your database and files to a safe place so you can restore the site after a crash, a hack or a bad update. The best plugins run automatically, store copies off-site and let you restore with one click. This guide compares the 5 most popular options and shows exactly how to set them up in 10 minutes.<\\\/p>' .\\n\\t\\t\\t'<h2>Why do you need a WordPress backup?<\\\/h2><p>Because hosting backups are often incomplete. In a 2025 survey, 43% of site owners lost data at least once. A daily backup costs less than 2 minutes of setup.<\\\/p>' .\\n\\t\\t\\t'<h2>Which backup plugin is best?<\\\/h2><ul><li>UpdraftPlus \\u2013 free, 3 million installs<\\\/li><li>BlogVault \\u2013 incremental, paid<\\\/li><li>Duplicator \\u2013 migration focus<\\\/li><\\\/ul>' .\\n\\t\\t\\t'<table><tr><th>Plugin<\\\/th><th>Price<\\\/th><\\\/tr><tr><td>UpdraftPlus<\\\/td><td>0 \\u20ac<\\\/td><\\\/tr><tr><td>BlogVault<\\\/td><td>89 \\u20ac<\\\/td><\\\/tr><\\\/table>' .\\n\\t\\t\\t'<p>See the <a href=\\\"https:\\\/\\\/wordpress.org\\\/plugins\\\/updraftplus\\\/\\\">official plugin page<\\\/a> and our <a href=\\\"\\\/best-seo-plugins-2026\\\/\\\">SEO plugin comparison<\\\/a>.<\\\/p>' .\\n\\t\\t\\t'<h3>How often should you back up?<\\\/h3><p>Daily for shops, weekly for blogs. Keep at least 30 versions.<\\\/p><img src=\\\"\\\/backup.png\\\" alt=\\\"Backup settings screen\\\" \\\/>',\\n\\t)\\n);\\nupdate_post_meta( $ids[0], '_geoins_keyword', 'WordPress backup plugin' );\\nupdate_post_meta( $ids[0], '_geoins_llms_pin', 1 );\\n$ids[] = wp_insert_post(\\n\\tarray(\\n\\t\\t'post_title'   => 'Best SEO Plugins 2026',\\n\\t\\t'post_name'    => 'best-seo-plugins-2026',\\n\\t\\t'post_status'  => 'publish',\\n\\t\\t'post_type'    => 'post',\\n\\t\\t'post_author'  => 1,\\n\\t\\t'post_content' => '<p>Short intro.<\\\/p><p>' . str_repeat( 'Lorem ipsum dolor sit amet consectetur. ', 40 ) . '<\\\/p><img src=\\\"\\\/x.png\\\" \\\/>',\\n\\t)\\n);\\n$ids[] = wp_insert_post(\\n\\tarray(\\n\\t\\t'post_title'   => 'About us',\\n\\t\\t'post_name'    => 'about-us',\\n\\t\\t'post_status'  => 'publish',\\n\\t\\t'post_type'    => 'page',\\n\\t\\t'post_author'  => 1,\\n\\t\\t'post_content' => '<p>We are a small team of 4 people writing about WordPress since 2019. We publish 12 guides a year.<\\\/p><h2>What do we do?<\\\/h2><p>Guides.<\\\/p><h2>Who writes here?<\\\/h2><p>Experts.<\\\/p><h2>How to reach us?<\\\/h2><p>Mail.<\\\/p>',\\n\\t)\\n);\\nupdate_option( 'geoins_e2e_ids', $ids );\\n\\\/\\\/ In use for a month: the review request (GEOINS_Review) is due once the traffic below is in.\\nupdate_option( 'geoins_activated_at', time() - 30 * DAY_IN_SECONDS );\\n\\n$settings                    = get_option( 'geoins_settings', array() );\\n$settings['toc']             = 1;\\n$settings['show_modified']   = 1;\\n$settings['referral_beacon'] = 1;\\n$settings['indexnow']        = 0;\\nupdate_option( 'geoins_settings', $settings );\\nupdate_user_meta( 1, 'description', 'Lucas writes about WordPress and GEO since 2019.' );\\nupdate_user_meta( 1, 'geoins_job_title', 'WordPress Developer' );\\nupdate_user_meta( 1, 'geoins_sameas', \\\"https:\\\/\\\/github.com\\\/example\\\\nhttps:\\\/\\\/www.linkedin.com\\\/in\\\/example\\\" );\\nflush_rewrite_rules( false );\\n\\n\\\/\\\/ ------------------------------------------------------------- 90 days of AI traffic (deterministic).\\nmt_srand( 42 );\\n$bots  = array(\\n\\t'gptbot'        => array( GEOINS_Bots::CAT_TRAINING, 9 ),\\n\\t'claudebot'     => array( GEOINS_Bots::CAT_TRAINING, 6 ),\\n\\t'ccbot'         => array( GEOINS_Bots::CAT_TRAINING, 3 ),\\n\\t'oai-searchbot' => array( GEOINS_Bots::CAT_RETRIEVAL, 5 ),\\n\\t'perplexitybot' => array( GEOINS_Bots::CAT_RETRIEVAL, 4 ),\\n\\t'chatgpt-user'  => array( GEOINS_Bots::CAT_AGENT, 4 ),\\n\\t'bingbot'       => array( GEOINS_Bots::CAT_SEARCH, 3 ),\\n);\\n$refs  = array(\\n\\t'chatgpt'    => 3,\\n\\t'perplexity' => 2,\\n\\t'gemini'     => 1,\\n);\\n$pages = array(\\n\\tarray( $ids[0], '\\\/wordpress-backup-guide\\\/' ),\\n\\tarray( $ids[1], '\\\/best-seo-plugins-2026\\\/' ),\\n\\tarray( $ids[2], '\\\/about-us\\\/' ),\\n\\tarray( 0, '\\\/' ),\\n);\\n\\n$hits_table  = $wpdb->prefix . 'geoins_hits';\\n$daily_table = $wpdb->prefix . 'geoins_daily';\\n$today       = (int) strtotime( gmdate( 'Y-m-d' ) ); \\\/\\\/ Midnight UTC.\\nfor ( $day = 89; $day >= 0; $day-- ) {\\n\\t$growth = 0.4 + ( 90 - $day ) \\\/ 75; \\\/\\\/ AI traffic grows over the quarter.\\n\\t$start  = $today - $day * DAY_IN_SECONDS;\\n\\t$span   = 0 === $day ? max( 1, time() - $today ) : DAY_IN_SECONDS; \\\/\\\/ Today: only the hours so far.\\n\\t$rows   = array();\\n\\tforeach ( $bots as $source => $bot ) {\\n\\t\\t$rows[] = array( 1, $source, $bot[0], (int) round( $bot[1] * $growth * mt_rand( 60, 140 ) \\\/ 100 * $span \\\/ DAY_IN_SECONDS ) );\\n\\t}\\n\\tforeach ( $refs as $source => $base ) {\\n\\t\\t$rows[] = array( 2, $source, 0, (int) round( $base * $growth * mt_rand( 0, 160 ) \\\/ 100 * $span \\\/ DAY_IN_SECONDS ) );\\n\\t}\\n\\tforeach ( $rows as $row ) {\\n\\t\\tlist( $type, $source, $category, $count ) = $row;\\n\\t\\t$per_page                                 = array();\\n\\t\\tfor ( $i = 0; $i < $count; $i++ ) {\\n\\t\\t\\t$page = mt_rand( 0, 9 ) < 6 ? 0 : mt_rand( 1, 3 );\\n\\t\\t\\tif ( $day < 7 ) {\\n\\t\\t\\t\\t$wpdb->insert(\\n\\t\\t\\t\\t\\t$hits_table,\\n\\t\\t\\t\\t\\tarray(\\n\\t\\t\\t\\t\\t\\t'hit_time' => gmdate( 'Y-m-d H:i:s', $start + mt_rand( 0, $span - 1 ) ),\\n\\t\\t\\t\\t\\t\\t'hit_type' => $type,\\n\\t\\t\\t\\t\\t\\t'source'   => $source,\\n\\t\\t\\t\\t\\t\\t'category' => $category,\\n\\t\\t\\t\\t\\t\\t'post_id'  => $pages[ $page ][0],\\n\\t\\t\\t\\t\\t\\t'path'     => $pages[ $page ][1],\\n\\t\\t\\t\\t\\t\\t'verified' => 2,\\n\\t\\t\\t\\t\\t)\\n\\t\\t\\t\\t);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t$per_page[ $page ] = ( $per_page[ $page ] ?? 0 ) + 1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t\\\/\\\/ Older days: one aggregate row per page, as the rollup writes them.\\n\\t\\tforeach ( $per_page as $page => $n ) {\\n\\t\\t\\t$wpdb->insert(\\n\\t\\t\\t\\t$daily_table,\\n\\t\\t\\t\\tarray(\\n\\t\\t\\t\\t\\t'day'      => gmdate( 'Y-m-d', $start ),\\n\\t\\t\\t\\t\\t'hit_type' => $type,\\n\\t\\t\\t\\t\\t'source'   => $source,\\n\\t\\t\\t\\t\\t'category' => $category,\\n\\t\\t\\t\\t\\t'post_id'  => $pages[ $page ][0],\\n\\t\\t\\t\\t\\t'path'     => $pages[ $page ][1],\\n\\t\\t\\t\\t\\t'verified' => 2,\\n\\t\\t\\t\\t\\t'n'        => $n,\\n\\t\\t\\t\\t)\\n\\t\\t\\t);\\n\\t\\t}\\n\\t}\\n}\\n\\\/\\\/ The seeded sources are \\\"known\\\", so the alert strip shows no first-contact flood.\\ndelete_option( 'geoins_seen_sources' );\\nGEOINS_Alerts::maybe_seed();\\n\\\/\\\/ \\u2026except one: a first visit by Claude-User an hour ago, for the \\\"What happened\\\" strip.\\n$wpdb->insert(\\n\\t$hits_table,\\n\\tarray(\\n\\t\\t'hit_time' => gmdate( 'Y-m-d H:i:s', time() - HOUR_IN_SECONDS ),\\n\\t\\t'hit_type' => 1,\\n\\t\\t'source'   => 'claude-user',\\n\\t\\t'category' => GEOINS_Bots::CAT_AGENT,\\n\\t\\t'post_id'  => $ids[0],\\n\\t\\t'path'     => '\\\/wordpress-backup-guide\\\/',\\n\\t\\t'verified' => 2,\\n\\t)\\n);\\nGEOINS_Alerts::on_hit( 1, 'claude-user' );\\n\\n\"}]}"}},"all_blocks":[],"tagged_versions":["2.3.1","2.3.2","2.4.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3736719,"resolution":"1","location":"assets","locale":"","width":1280,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3736719,"resolution":"2","location":"assets","locale":"","width":1280,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3736719,"resolution":"3","location":"assets","locale":"","width":1280,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3736719,"resolution":"4","location":"assets","locale":"","width":1280,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3736719,"resolution":"5","location":"assets","locale":"","width":1280,"height":900},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3736719,"resolution":"6","location":"assets","locale":"","width":1280,"height":900},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3736719,"resolution":"7","location":"assets","locale":"","width":1280,"height":900}},"screenshots":{"1":"AI statistics: citation alerts, filter by AI company, KPIs per bot class and accesses per day.","2":"Term \u00d7 AI matrix and flows: which AI reads which page for which term.","3":"AI companies treemap and the crawl heatmap (weekday \u00d7 hour).","4":"GEO audit: every post and page scored against the 13 GEO checks, biggest opportunities first.","5":"Live GEO checks in the block editor sidebar.","6":"Settings \u2013 every option explains its direct benefit.","7":"AI crawler control (robots.txt), grouped by what blocking actually costs you."}},"plugin_section":[],"plugin_tags":[236374,232780,216196,2591,244604],"plugin_category":[36,49,55],"plugin_contributors":[285368],"plugin_business_model":[],"class_list":["post-379780","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-seo","plugin_tags-ai-crawler","plugin_tags-chatgpt","plugin_tags-geo","plugin_tags-llms-txt","plugin_category-analytics","plugin_category-maps-and-location","plugin_category-seo-and-marketing","plugin_contributors-lcswll","plugin_committers-lcswll"],"banners":{"banner":"https:\/\/ps.w.org\/wille-geo-ai-visibility\/assets\/banner-772x250.png?rev=3736719","banner_2x":"https:\/\/ps.w.org\/wille-geo-ai-visibility\/assets\/banner-1544x500.png?rev=3736719","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/wille-geo-ai-visibility\/assets\/icon-128x128.gif?rev=3736719","icon_2x":"https:\/\/ps.w.org\/wille-geo-ai-visibility\/assets\/icon-256x256.gif?rev=3736719","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/wille-geo-ai-visibility\/assets\/screenshot-1.png?rev=3736719","caption":"AI statistics: citation alerts, filter by AI company, KPIs per bot class and accesses per day."},{"src":"https:\/\/ps.w.org\/wille-geo-ai-visibility\/assets\/screenshot-2.png?rev=3736719","caption":"Term \u00d7 AI matrix and flows: which AI reads which page for which term."},{"src":"https:\/\/ps.w.org\/wille-geo-ai-visibility\/assets\/screenshot-3.png?rev=3736719","caption":"AI companies treemap and the crawl heatmap (weekday \u00d7 hour)."},{"src":"https:\/\/ps.w.org\/wille-geo-ai-visibility\/assets\/screenshot-4.png?rev=3736719","caption":"GEO audit: every post and page scored against the 13 GEO checks, biggest opportunities first."},{"src":"https:\/\/ps.w.org\/wille-geo-ai-visibility\/assets\/screenshot-5.png?rev=3736719","caption":"Live GEO checks in the block editor sidebar."},{"src":"https:\/\/ps.w.org\/wille-geo-ai-visibility\/assets\/screenshot-6.png?rev=3736719","caption":"Settings \u2013 every option explains its direct benefit."},{"src":"https:\/\/ps.w.org\/wille-geo-ai-visibility\/assets\/screenshot-7.png?rev=3736719","caption":"AI crawler control (robots.txt), grouped by what blocking actually costs you."}],"raw_content":"<!--section=description-->\n<p><strong>GEO (Generative Engine Optimization) made simple.<\/strong> AI assistants are becoming a major way people find websites. Wille GEO shows you which AI systems read your pages \u2013 GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot, Google-Extended and more \u2013 and how many people click through to you from ChatGPT, Perplexity, Gemini and Copilot. On top, it gives you a set of optimizations for AI search, each with a plain-language explanation of what it does.<\/p>\n\n<p><strong>Results from the first minute.<\/strong> Right after activation the dashboard checks whether anything keeps AI crawlers away from your site, scores your existing posts and pages for AI search and offers an email notification for the first AI visit. The statistics fill up as AI systems arrive. Works alongside Yoast SEO, Rank Math, All in One SEO, SEOPress and The SEO Framework.<\/p>\n\n<p><strong>Free. No subscription, no premium version, no account, no personal data.<\/strong> Two optional features contact external services and are off until you enable them \u2013 see \"External services\" below.<\/p>\n\n<h4>AI statistics<\/h4>\n\n<ul>\n<li><strong>Which AI reads which page for which term<\/strong> \u2013 every access by ChatGPT-User, GPTBot, OAI-SearchBot, ClaudeBot, Claude-User, PerplexityBot, Perplexity-User, Bingbot, Bytespider, Amazonbot, CCBot and more is logged and mapped to the focus term of the page.<\/li>\n<li><strong>The three bot classes explained<\/strong>: Agent bots fetch your page live because a human just asked an AI about it. Retrieval bots build the index AI answers cite from. Training bots only feed models. The dashboard separates them, because they mean completely different things for your business.<\/li>\n<li><strong>Human visitors from AI answers<\/strong>: people who click your link inside ChatGPT, Perplexity, Gemini, Copilot &amp; co. \u2013 detected via referrer and via utm_source (ChatGPT tags its outbound links, which survives even stripped referrers).<\/li>\n<li><strong>Bot identity verification (opt-in)<\/strong>: user agents can be faked. Enable verification and every hit is checked against the official IP ranges published by OpenAI, Anthropic, Perplexity, Google and Microsoft \u2013 impostors are flagged separately.<\/li>\n<li><strong>Counts AI visitors even behind full-page caches<\/strong>: an opt-in, sub-1-kB beacon reports visits from AI answers that server-side tracking cannot see (no cookies, no IPs, no external service).<\/li>\n<li><strong>Weekly email report (opt-in)<\/strong>: totals with trend, top bots, AI visitors, most-read pages and open issues \u2013 sent only when there was AI activity.<\/li>\n<li><strong>AI column in your content lists<\/strong>: see AI accesses of the last 30 days next to every post and page.<\/li>\n<li>Modern React dashboard: interactive stacked timeline (tooltips, zoom brush, toggleable series), KPI cards with sparklines and change vs. the previous period, bot-class donut, top bots, term \u00d7 AI matrix, landing pages, 7\/30\/90-day ranges, CSV export.<\/li>\n<li>Built to scale: raw hits are compressed into a daily aggregate table after 7 days, so the dashboard stays fast on busy sites.<\/li>\n<li><strong>WP-CLI<\/strong>: <code>wp geoins stats<\/code>, <code>export<\/code>, <code>report<\/code>, <code>cleanup<\/code>, <code>refresh-ranges<\/code>, <code>selftest<\/code>.<\/li>\n<\/ul>\n\n<h4>GEO optimizations \u2013 always with a benefit explanation<\/h4>\n\n<ul>\n<li><strong>AI crawler control (robots.txt)<\/strong>: block or allow each AI bot individually, grouped by what blocking actually costs you. Blocking training bots does not affect whether AI answers can cite you; blocking retrieval\/agent bots removes you from AI answers \u2013 the UI points this out clearly.<\/li>\n<li><strong>llms.txt generator<\/strong>: a machine-readable Markdown summary of your site at \/llms.txt. Honest explanation included: big crawlers rarely fetch it yet, but it costs nothing and helps AI agents.<\/li>\n<li><strong>llms-full.txt + Markdown endpoints<\/strong>: your complete key content as clean Markdown in one file, and a Markdown version of every page by appending .md to its URL (advertised via a link tag) \u2013 pure content, cheap for AI agents to read.<\/li>\n<li><strong>Live GEO checks while you write<\/strong>: in the block editor, the 13-point checklist updates as you type, right in the sidebar.<\/li>\n<li><strong>Structured data (JSON-LD)<\/strong>: WebSite, Organization\/Person, Article with dates and author, breadcrumbs \u2013 plus automatic <strong>FAQ schema from question headings<\/strong> (H2\/H3 ending in \u201c?\u201d).<\/li>\n<li><strong>Meta description &amp; Open Graph<\/strong> fallbacks \u2013 only when no other SEO plugin is active, so nothing is ever duplicated.<\/li>\n<li><strong>GEO check per post<\/strong>: a 13-point checklist (direct answer first, question headings, lists\/tables, concrete numbers, internal links, image alt text, freshness, author bio \u2026) \u2013 every check explains why AI systems care.<\/li>\n<li><strong>Site status panel<\/strong>: visibility, robots.txt analysis, permalinks, sitemap, llms.txt, IndexNow, schema \u2013 traffic-light simple.<\/li>\n<li><strong>Content &amp; freshness signals<\/strong>: exact lastmod times in the XML sitemap, an optional visible \"Updated on\" date, and an optional auto table of contents with citable heading anchors.<\/li>\n<li><strong>Author E-E-A-T<\/strong>: job title + profile URLs per author feed the article schema; author archives ship ProfilePage structured data.<\/li>\n<li><strong>IndexNow (opt-in)<\/strong>: new and updated content is pushed to Bing &amp; co. within minutes. Bing feeds Copilot and parts of ChatGPT search \u2013 faster indexing means faster AI citations.<\/li>\n<li><strong>\"How it works\" page<\/strong>: a plain-language explainer for non-technical users \u2013 what GEO is, how the plugin works, and an honest assessment of what results to expect.<\/li>\n<\/ul>\n\n<h4>Plays nicely with your SEO plugin<\/h4>\n\n<p>Yoast SEO, Rank Math, All in One SEO, SEOPress and The SEO Framework are detected automatically. Wille GEO then leaves schema and meta tags to them and only adds what they don't do: AI tracking, llms.txt, AI robots control and GEO content checks.<\/p>\n\n<h4>Privacy<\/h4>\n\n<ul>\n<li>No IP addresses stored, no cookies set, no fingerprinting.<\/li>\n<li>No external requests by default. The only exceptions are two opt-in features, documented in \"External services\" below.<\/li>\n<li>Configurable data retention with automatic cleanup.<\/li>\n<li>Data is only removed on uninstall if you opt in.<\/li>\n<\/ul>\n\n<h4>About the author<\/h4>\n\n<p>Wille GEO is developed and maintained by Lucas Wille, a web developer from Magdeburg, Germany, who builds websites and AI automations: https:\/\/lucaswille.de\/<\/p>\n\n<p>Found a bug or have an idea? Open a topic in the support forum. And if the plugin helps you, a review on WordPress.org is the best way to say thanks \u2013 it helps other site owners find it.<\/p>\n\n<h3>External services<\/h3>\n\n<p>The plugin works without any external service. Two optional features, both off by default, connect to third-party services. Nothing is sent on activation; nothing is sent to the plugin author.<\/p>\n\n<h4>Bot identity verification (opt-in, setting \"Verify bot identity against official IP ranges\")<\/h4>\n\n<p>Used to check whether a visitor that claims to be an AI crawler really comes from that company. When enabled, the plugin downloads the public lists of crawler IP ranges once a day (WP-Cron) from the services below. These are plain GET requests for public JSON files; no data about your site or your visitors is sent, apart from the technical request itself (your server's IP address and a user agent naming the plugin). Visitor IPs are compared locally in memory and never stored or transmitted.<\/p>\n\n<ul>\n<li>OpenAI \u2013 https:\/\/openai.com\/gptbot.json, https:\/\/openai.com\/searchbot.json, https:\/\/openai.com\/chatgpt-user.json. Terms of use: https:\/\/openai.com\/policies\/terms-of-use\/ \u2013 Privacy policy: https:\/\/openai.com\/policies\/privacy-policy\/<\/li>\n<li>Anthropic \u2013 https:\/\/claude.com\/crawling\/bots.json. Terms: https:\/\/www.anthropic.com\/legal\/commercial-terms \u2013 Privacy policy: https:\/\/www.anthropic.com\/legal\/privacy<\/li>\n<li>Perplexity \u2013 https:\/\/www.perplexity.ai\/perplexitybot.json, https:\/\/www.perplexity.ai\/perplexity-user.json. Terms of service: https:\/\/www.perplexity.ai\/hub\/legal\/terms-of-service \u2013 Privacy policy: https:\/\/www.perplexity.ai\/hub\/legal\/privacy-policy<\/li>\n<li>Google \u2013 https:\/\/developers.google.com\/static\/search\/apis\/ipranges\/special-crawlers.json. Terms of service: https:\/\/policies.google.com\/terms \u2013 Privacy policy: https:\/\/policies.google.com\/privacy<\/li>\n<li>Microsoft (Bing) \u2013 https:\/\/www.bing.com\/toolbox\/bingbot.json. Services agreement: https:\/\/www.microsoft.com\/en-us\/servicesagreement \u2013 Privacy statement: https:\/\/www.microsoft.com\/en-us\/privacy\/privacystatement<\/li>\n<\/ul>\n\n<h4>IndexNow (opt-in, setting \"Ping IndexNow on publish and update\")<\/h4>\n\n<p>Used to notify search engines (Bing, Seznam, Naver and others) as soon as content changes, so it is recrawled sooner. When enabled, each time a post is published, updated or deleted the plugin sends the post's URL, your site's host name and the IndexNow key of your site to https:\/\/api.indexnow.org\/indexnow, which shares it with the participating search engines. Once a day the plugin also requests its own key file from your site to make sure the engines can verify it. No visitor data is sent.<\/p>\n\n<ul>\n<li>IndexNow terms: https:\/\/www.indexnow.org\/terms \u2013 documentation: https:\/\/www.indexnow.org\/documentation<\/li>\n<li>The shared endpoint api.indexnow.org is operated by Microsoft: Privacy statement https:\/\/www.microsoft.com\/en-us\/privacy\/privacystatement<\/li>\n<\/ul>\n\n<h4>Weekly email report (opt-in)<\/h4>\n\n<p>Sent with your site's own wp_mail() configuration to the address you enter; the plugin itself does not contact a mail service.<\/p>\n\n<h3>Third-party libraries<\/h3>\n\n<p>The statistics dashboard bundles the following open-source libraries into assets\/js\/geoins-dashboard.js (no CDN, no external requests; license headers are preserved in the bundle):<\/p>\n\n<ul>\n<li>React and ReactDOM \u2013 Copyright (c) Meta Platforms, Inc. and affiliates. Released under the MIT License.<\/li>\n<li>Apache ECharts \u2013 Copyright (c) The Apache Software Foundation. Released under the Apache License 2.0 (GPL-compatible).<\/li>\n<li>Simple Icons (selected brand icon paths) \u2013 released under CC0 1.0; all trademarks remain the property of their respective owners and are used for identification only.<\/li>\n<\/ul>\n\n<p>The license headers of these libraries are kept in the bundle, and the readable source of the bundle ships with the plugin in src\/dashboard\/. Full license texts:<\/p>\n\n<ul>\n<li>MIT License: https:\/\/opensource.org\/licenses\/MIT<\/li>\n<li>Apache License 2.0: https:\/\/www.apache.org\/licenses\/LICENSE-2.0<\/li>\n<li>CC0 1.0: https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>In your dashboard go to Plugins \u2192 Add New, search for \"Wille GEO\" and click Install, then Activate. (Or upload the ZIP under Plugins \u2192 Add New \u2192 Upload Plugin.)<\/li>\n<li>Open Wille GEO \u2192 Settings. Tracking, llms.txt, Markdown endpoints and sitemap freshness work right away; everything that sends data anywhere (bot verification, IndexNow, email reports) stays off until you switch it on.<\/li>\n<li>Optional: give your key posts a focus term in the \"GEO check\" panel of the editor, so the statistics can map AI accesses to topics.<\/li>\n<li>Open Wille GEO \u2192 AI Statistics: until the first AI crawler visits (usually within a few days), it shows what blocks AI systems, scores your existing content and offers an email notification for the first AI visit.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20term%20did%20an%20ai%20search%20for%20when%20it%20accessed%20my%20site%3F\"><h3>Which term did an AI search for when it accessed my site?<\/h3><\/dt>\n<dd><p>AI crawlers do not transmit search queries \u2013 no tool can see them. Wille GEO gives you the honest, practical equivalent: you assign a focus term to each post (or the title is used), and every AI access is mapped to that term. For human visitors from AI answers, the source (ChatGPT, Perplexity \u2026) and landing page are recorded.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20slow%20down%20my%20site%3F\"><h3>Does this plugin slow down my site?<\/h3><\/dt>\n<dd><p>No. Tracking is a single indexed database insert, and only for requests that match a known AI signature. By default there is no JavaScript on your public pages (the optional AI-visitor beacon is under 1 kB) and no external service.<\/p><\/dd>\n<dt id=\"do%20i%20need%20this%20if%20i%20already%20use%20an%20seo%20plugin%3F\"><h3>Do I need this if I already use an SEO plugin?<\/h3><\/dt>\n<dd><p>Yes \u2013 classic SEO plugins optimize for Google's blue links. Wille GEO adds the AI layer: who reads your content, AI crawler control, llms.txt and AI-oriented content checks. Overlapping features are disabled automatically.<\/p><\/dd>\n<dt id=\"my%20seo%20plugin%20already%20creates%20an%20llms.txt.%20what%20does%20wille%20geo%20add%3F\"><h3>My SEO plugin already creates an llms.txt. What does Wille GEO add?<\/h3><\/dt>\n<dd><p>The statistics. An llms.txt only invites AI systems; Wille GEO shows which AI systems actually read which of your pages, separates training, AI search and live agent requests, counts the people who click through from AI answers and can verify bot identities against the official IP ranges. If your SEO plugin already serves an llms.txt, simply leave the llms.txt option in Wille GEO switched off.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page%20caching%3F\"><h3>Does it work with page caching?<\/h3><\/dt>\n<dd><p>Bot tracking runs in PHP; requests served entirely from a full-page cache bypass it. AI crawlers frequently request uncached variants, so bot numbers stay a solid picture (treat them as a lower bound). For human visitors from AI answers there is a fix: enable the opt-in beacon and those visits are counted in the browser \u2013 cache or no cache.<\/p><\/dd>\n<dt id=\"how%20many%20new%20customers%20will%20this%20bring%20me%3F\"><h3>How many new customers will this bring me?<\/h3><\/dt>\n<dd><p>An honest answer: visitors from AI answers are still a small share of most sites' traffic, but the share is growing, and these visitors arrive with a clear intent \u2013 they already read an AI summary and clicked because they want more. The plugin takes care of the technical basics (crawler access, llms.txt, structured data, freshness signals) and shows you which pages AI systems read; the content quality that earns citations still has to come from you. The \"How it works\" page in the plugin gives you a realistic, hype-free assessment.<\/p><\/dd>\n<dt id=\"is%20the%20user-agent%20detection%20reliable%3F\"><h3>Is the user-agent detection reliable?<\/h3><\/dt>\n<dd><p>User agents can be spoofed. By default the plugin matches the official signatures of each AI company \u2013 a very good indicator. For proof, enable the opt-in identity verification: every hit from OpenAI, Anthropic and Perplexity crawlers is then checked against the official IP ranges those companies publish, and impostors are flagged separately in your statistics.<\/p><\/dd>\n<dt id=\"where%20is%20the%20source%20code%20of%20the%20dashboard%3F\"><h3>Where is the source code of the dashboard?<\/h3><\/dt>\n<dd><p>The dashboard script (assets\/js\/geoins-dashboard.js) is built with esbuild from the readable React source that ships with the plugin in src\/dashboard\/. Development repository with the build and test tooling: https:\/\/github.com\/lcswll\/wordpress-geo<\/p><\/dd>\n<dt id=\"is%20this%20gdpr%20compliant%3F\"><h3>Is this GDPR compliant?<\/h3><\/dt>\n<dd><p>The plugin is built privacy-first: it stores no personal data at all (no IPs, no cookies, no user agents of human visitors). Bot statistics are not personal data. As with any tool, the overall compliance of your site remains your responsibility.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>New: first-run panel \u2013 until the first AI visit, the statistics page shows what keeps AI systems away from your site, scores your existing posts and pages for AI search (weakest pages first) and turns on the email notification for the first AI visit in one click.<\/li>\n<li>New: when a new AI reads your site for the first time, a notice on the WordPress dashboard tells you \u2013 also if you rarely open the plugin.<\/li>\n<li>Translations: German (formal and informal) reviewed against the German WordPress style guide and glossary; 34 more languages submitted to translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>2.3.2<\/h4>\n\n<ul>\n<li>New: Live Preview on wordpress.org \u2013 try the plugin in your browser with a filled demo dashboard, no installation needed.<\/li>\n<li>Readme: more precise search tags.<\/li>\n<\/ul>\n\n<h4>2.3.1<\/h4>\n\n<ul>\n<li>Security: Markdown endpoints, llms.txt and llms-full.txt escape their output \u2013 text that decodes to markup (e.g. \"&lt;script&gt;\" in a post) can no longer reach the response; sent with X-Content-Type-Options: nosniff.<\/li>\n<li>Hardened: profile fields verify the nonce themselves, utm_source is read from the request URI, no silenced errors, robots.txt is read via the WordPress filesystem API, WP-CLI export writes via WP_Filesystem.<\/li>\n<li>Development: no check can be switched off by a code comment anymore \u2013 PHPCS ignores inline annotations (database sniffs aside), Plugin Check fails on warnings.<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Changed: the plugin is now called \"Wille GEO \u2013 AI Crawler Stats, llms.txt &amp; AI Visibility\" (slug wille-geo-ai-visibility) to avoid confusion with an unrelated product of the same name.<\/li>\n<li>Security: JSON-LD output escapes &lt;, &gt;, &amp; and quotes, so no value can end the script element.<\/li>\n<li>Security: the opt-in AI-visitor beacon now requires a same-origin request and a page token signed with the site's secret salt.<\/li>\n<li>Fixed: PHP 7.4 compatibility \u2013 no PHP 8-only string functions are used anymore.<\/li>\n<li>Changed: no translation files are bundled anymore; translations are delivered by translate.wordpress.org.<\/li>\n<li>Changed: the welcome notice after activation only appears on the Plugins screen.<\/li>\n<li>Docs: new \"External services\" section with what is sent, when, and links to the terms and privacy policies.<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>New: redesigned admin screens \u2013 a brand bar with the radar logo and navigation between Statistics, Audit, Settings and the explainer on every page, plus a consistent indigo accent for buttons, toggles and filters.<\/li>\n<li>New: author credit and links \u2013 the plugin list shows \"How it works\" and a rating link; the footer of the plugin's pages credits the author.<\/li>\n<li>New: a friendly, one-time review request on the plugin's own pages \u2013 only after two weeks of use and once AI accesses are actually being recorded. \"Maybe later\" hides it for 30 days, \"I already did\" for good. Never shown elsewhere in the admin.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Changed: requires WordPress 6.5 or newer.<\/li>\n<li>Improved: all statistics queries use prepared identifiers for table and column names, with an allow-list for groupable columns.<\/li>\n<li>Improved: the GEO check meta box (classic editor) builds its result list with DOM methods instead of HTML strings.<\/li>\n<li>Fixed: the table of contents could empty a post if the heading scan failed on very large content \u2013 the content is now left untouched instead.<\/li>\n<li>Fixed: rarely hit error paths (CSV export without a writable output stream, missing page lists, failed regex runs on huge content) are handled gracefully.<\/li>\n<li>Development: automated test suite (unit tests, integration tests in a real WordPress on PHP 7.4 and 8.4, browser tests) and the readable dashboard source in src\/dashboard\/.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>New: visualization engine switched to Apache ECharts 6 \u2013 smoother canvas rendering, richer tooltips, a zoom slider on long ranges, legend toggling built in.<\/li>\n<li>New: AI companies treemap (share of accesses, click a company to zoom into its bots).<\/li>\n<li>New: flow diagram (Sankey) \u2013 which AI bot reads which page, band width = accesses.<\/li>\n<li>New: crawl heatmap \u2013 bot accesses by weekday and hour in your site's timezone, so you can publish before the busy hours.<\/li>\n<li>New: site GEO score gauge on the audit page, next to the score distribution and the opportunity map.<\/li>\n<li>Improved: donuts with rounded segments and centered totals, moving-average trend for AI visitors, animated gauge\/histogram; all charts honor prefers-reduced-motion.<\/li>\n<li>Verified end-to-end on a real WordPress (Playground, PHP 8.2) \u2013 zero PHP warnings across all screens.<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>New: audit charts \u2013 an opportunity map (every AI-read page plotted by AI accesses vs. GEO score, click a dot to edit) and a score distribution histogram.<\/li>\n<li>New: dashboard charts \u2013 a bot-identity donut (verified \/ impostors \/ unchecked) when verification is on, and an AI-visitor trend line with 7-day moving average.<\/li>\n<li>New: the built-in self-test can be run from a live site via the admin-only REST route geoins\/v1\/selftest (44 assertions, shared with wp geoins selftest).<\/li>\n<li>Verified end-to-end on a real WordPress instance (WordPress Playground, PHP 8.2): bot and referral tracking, beacon, AI radar, alerts, llms.txt\/.md endpoints with 304 revalidation, robots.txt analysis, structured data incl. author E-E-A-T, sitemap lastmod, dashboard\/audit\/settings screens \u2013 zero PHP warnings.<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>New: citation alerts \u2013 the dashboard (and an opt-in daily-bundled email) tells you the moment a new AI crawls your site for the first time, the first human visitors arrive from an AI assistant, or AI visitors spike. Existing sources are seeded silently on upgrade, so nothing floods.<\/li>\n<li>New: AI radar \u2013 AI-sounding crawlers that are NOT in the registry yet are collected with their user agent and counts, so new AI systems surface instead of staying invisible. Dismiss known noise with one click; add real ones via the geoins_bots filter.<\/li>\n<li>New: site-wide GEO Audit page \u2013 every published post and page scored against the 13 checks in a sortable table (worst first), with the failed checks and the AI accesses of the last 30 days side by side. Scores are cached per post and refresh automatically when content changes.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Improved: modernized admin UI \u2013 design tokens, elevated KPI cards with gradient accent bars and hover lift, a segmented pill toolbar, gradient stat bars, refined tables and status cards, smoother animated charts (respecting prefers-reduced-motion), polished toggles and a sticky save bar on the settings page. Pure visual refresh, no behavior changes.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>New: exact update times (lastmod) in the core XML sitemap \u2013 WordPress omits them; reliable lastmod makes engines recrawl changed pages faster, so updates reach AI answers sooner. On by default.<\/li>\n<li>New: visible \"Updated on\" date on meaningfully revised posts (opt-in) \u2013 freshness is a ranking and citation signal, and the visible date is what snippets and AI answers pick up.<\/li>\n<li>New: automatic table of contents with anchor IDs on H2\/H3 headings (opt-in) \u2013 every section becomes precisely citable via deep link.<\/li>\n<li>New: author E-E-A-T signals \u2013 job title and profile URLs (sameAs) on the user profile flow into the article schema, and author archives get Google's documented ProfilePage structured data.<\/li>\n<li>New: two more GEO checks \u2013 at least one internal link, and alt text on all images (13 checks total, live in the editor as always).<\/li>\n<li>New: .md endpoints answer conditional requests (Last-Modified \/ 304) \u2013 cheaper recrawls for AI agents.<\/li>\n<li>New: status check for pretty permalinks (required by the .md endpoints and the IndexNow key file).<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Improved: the robots.txt status check now reads and analyzes a physical robots.txt instead of blanket-warning about it. A file that blocks no citation-relevant AI bots and matches your configured blocks is reported as fine (green); the check warns specifically when the file blocks bots that put you into AI answers, when it blocks ALL crawlers, or when your configured blocks are missing from it. The settings page notice is analysis-aware too.<\/li>\n<li>New: wp geoins selftest covers the robots.txt analyzer (12 new assertions), including BOM handling, wildcard syntax (Disallow: \/*), version-suffixed tokens (GPTBot\/1.0) and exception groups.<\/li>\n<li>Improved: the analyzer resolves the real web-root robots.txt on \"WordPress in its own directory\"\/Bedrock layouts and refuses to judge files larger than the 500 KiB crawler processing limit.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>New: filter the entire dashboard by AI company \u2013 one click on OpenAI, Anthropic, Perplexity, Google, Microsoft &amp; co. filters totals, timeline, bots, visitors, the term matrix, landing pages and the CSV export. Chips appear for the AIs active in the selected range.<\/li>\n<li>New: brand icons everywhere \u2013 top bots, AI visitor sources, the term matrix and the filter chips show each AI's mark (Simple Icons, CC0 collection). Brands that do not permit icon redistribution (OpenAI, Microsoft, Amazon \u2026) get clean monogram badges in their brand colors.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>New: the statistics dashboard is now a modern React app \u2013 interactive stacked timeline with tooltips, zoom brush (30\/90 days) and clickable legend to toggle series, sparklines in the KPI cards, a donut of bot classes, horizontal bar charts for top bots and AI referral sources, loading skeletons and a friendly first-run screen.<\/li>\n<li>New: REST API endpoint (geoins\/v1\/dashboard, admin-only) replaces the admin-ajax data endpoint.<\/li>\n<li>Note: charts are rendered with Recharts (MIT), bundled locally \u2013 no CDN, no external requests. Build source: src\/dashboard\/ in the development repository (see plugin homepage).<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>New: weekly email report (opt-in) \u2013 totals with trend, top bots, AI visitors, most-read pages and open issues; sent only when there was AI activity.<\/li>\n<li>New: IndexNow integration (opt-in) \u2013 new and updated content is pushed to Bing &amp; co. within minutes; key file is generated and served automatically.<\/li>\n<li>New: cache-proof AI visitor counting (opt-in) \u2013 a sub-1-kB browser beacon counts visitors from AI answers even when pages are served from a full-page cache.<\/li>\n<li>New: \"How it works\" page \u2013 a plain-language explainer of GEO, the plugin, and realistic expectations, written for non-technical users.<\/li>\n<li>New: WP-CLI commands \u2013 wp geoins stats \/ export \/ report \/ cleanup \/ refresh-ranges \/ selftest.<\/li>\n<li>New: \"AI (30d)\" column on the posts and pages lists shows AI accesses per item.<\/li>\n<li>New: bot identity verification now also covers Google (GoogleOther) and Microsoft (Bingbot) via their official IP lists.<\/li>\n<li>New: 8 more AI crawlers recognized \u2013 Applebot, YouBot, PetalBot, AI2Bot, Cohere, Diffbot, Timpibot, Omgilibot (26 total).<\/li>\n<li>New: article schema now includes keywords (focus term + tags).<\/li>\n<li>New: AI bot fetches of .md pages, llms.txt and llms-full.txt now appear in the statistics (previously these endpoint hits were invisible).<\/li>\n<li>Improved: referral dedupe is now per-visitor (salted, expiring hash \u2013 nothing stored), so several people arriving from the same AI answer within a minute are all counted.<\/li>\n<li>Improved: visits through a canonical redirect are no longer counted twice under two paths.<\/li>\n<li>Improved: statistics windows now partition rolled-up days cleanly \u2013 totals, trend arrows and the daily chart are consistent.<\/li>\n<li>Fixed: .md endpoints and dashboard links now work correctly on subdirectory installs.<\/li>\n<li>Fixed: a settings save while verification was off no longer wipes the proxy\/CDN header choice.<\/li>\n<li>Fixed: network-wide deactivation now clears the cron events on every subsite; uninstall clears them too.<\/li>\n<li>Fixed: uninstall now also removes llms.txt pins and all new options.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Fixed: bot identity verification now works behind Cloudflare and other proxies\/CDNs \u2013 declare your setup in the settings and the original visitor IP is used. Without this, every real bot behind a CDN looked like an impostor.<\/li>\n<li>Fixed: word counts are now Unicode-aware (umlauts and accents no longer split words) \u2013 affects the GEO checks and the wordCount in structured data.<\/li>\n<li>Improved: the live editor checks are debounced, keeping the editor smooth on long posts.<\/li>\n<li>New: feature content in llms.txt \u2013 a checkbox on the edit screen pins your most important pages into a \"Key content\" section, listed first in llms.txt and llms-full.txt.<\/li>\n<li>New: sameAs profiles in structured data (one URL per line) \u2013 AI systems recognize you as one consistent entity (E-E-A-T).<\/li>\n<li>New: quick actions \"Block all training bots\" \/ \"Allow all bots\" in the crawler settings.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: opt-in bot identity verification against the official IP ranges of OpenAI, Anthropic and Perplexity \u2013 impostors are flagged.<\/li>\n<li>New: live GEO checks in the block editor sidebar (updates while you type).<\/li>\n<li>New: llms-full.txt and Markdown endpoints (.md URL for every page, advertised via link tag).<\/li>\n<li>New: CSV export and change vs. previous period in the dashboard.<\/li>\n<li>New: welcome pointer after activation.<\/li>\n<li>Improved: daily aggregate table keeps the dashboard fast on busy sites; term matrix now runs on a single query.<\/li>\n<li>Improved: referral double-count protection (60-second window).<\/li>\n<li>Fixed: full multisite support (network activation, new subsites, uninstall).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: AI bot tracking, AI referral tracking, statistics dashboard, robots.txt AI control, llms.txt generator, JSON-LD schema with auto-FAQ, meta tags, per-post GEO checks, EN\/DE translations.<\/li>\n<\/ul>","raw_excerpt":"See which AI (ChatGPT, Claude, Perplexity \u2026) reads which page for which term \u2013 and optimize your site for AI search. Free, no subscription.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/379780","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=379780"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lcswll"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=379780"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=379780"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=379780"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=379780"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=379780"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=379780"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}