{"id":329075,"date":"2026-06-29T15:39:20","date_gmt":"2026-06-29T15:39:20","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/kantan-analytics\/"},"modified":"2026-06-29T16:18:23","modified_gmt":"2026-06-29T16:18:23","slug":"kantan-analytics","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/kantan-analytics\/","author":23507076,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.20.1","stable_tag":"2.20.1","tested":"7.0","requires":"5.6","requires_php":"7.0","requires_plugins":null,"header_name":"Kantan Analytics","header_author":"Try Kantan","header_description":"Lightweight, privacy-friendly analytics for WordPress that keeps all data in your database. Track visits, clicks, scroll depth, user journeys, and traffic sources with a beautiful Tailwind dashboard. No external services, no cookies - just simple, self-hosted visitor insights.","assets_banners_color":"f8f7f5","last_updated":"2026-06-29 16:18:23","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/trykantan.com","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":11,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.20.1":{"tag":"2.20.1","author":"inglewood","date":"2026-06-29 16:18:23"}},"upgrade_notice":{"2.11.0":"<p>New Conversions tab; dashboard assets bundled locally (no CDN); privacy-policy text added to Settings \u2192 Privacy. Safe upgrade \u2014 no manual steps.<\/p>","2.10.0":"<p>Adds a Realtime tab and live visitor-count badge. Safe upgrade \u2014 no manual steps.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3590336,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3590336,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3590336,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3590336,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3590336,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.20.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3590336,"resolution":"1","location":"assets","locale":"","width":1280,"height":1332},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3590336,"resolution":"2","location":"assets","locale":"","width":1280,"height":1332},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3590336,"resolution":"3","location":"assets","locale":"","width":1280,"height":1332},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3590336,"resolution":"4","location":"assets","locale":"","width":1280,"height":1332},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3590336,"resolution":"5","location":"assets","locale":"","width":1280,"height":1332}},"screenshots":{"1":"Overview dashboard \u2014 sessions, pageviews, bounce rate, and duration with trend charts and sparklines.","2":"Interactions \u2014 click region heatmap, scroll-depth distribution, and top-clicked elements.","3":"Journeys \u2014 page-by-page navigation paths for named, persistent visitors.","4":"Realtime \u2014 visitors active in the last five minutes with current page and traffic source.","5":"Settings \u2014 retention, IP exclusion, conversion link rules, and the AI agent download."}},"plugin_section":[],"plugin_tags":[232,6207,396,521,259455],"plugin_category":[36,54],"plugin_contributors":[269490],"plugin_business_model":[],"class_list":["post-329075","plugin","type-plugin","status-publish","hentry","plugin_tags-analytics","plugin_tags-heatmap","plugin_tags-privacy","plugin_tags-statistics","plugin_tags-user-journey","plugin_category-analytics","plugin_category-security-and-spam-protection","plugin_contributors-inglewood","plugin_committers-inglewood"],"banners":{"banner":"https:\/\/ps.w.org\/kantan-analytics\/assets\/banner-772x250.png?rev=3590336","banner_2x":"https:\/\/ps.w.org\/kantan-analytics\/assets\/banner-1544x500.png?rev=3590336","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/kantan-analytics\/assets\/icon.svg?rev=3590336","icon":"https:\/\/ps.w.org\/kantan-analytics\/assets\/icon.svg?rev=3590336","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/kantan-analytics\/assets\/screenshot-1.png?rev=3590336","caption":"Overview dashboard \u2014 sessions, pageviews, bounce rate, and duration with trend charts and sparklines."},{"src":"https:\/\/ps.w.org\/kantan-analytics\/assets\/screenshot-2.png?rev=3590336","caption":"Interactions \u2014 click region heatmap, scroll-depth distribution, and top-clicked elements."},{"src":"https:\/\/ps.w.org\/kantan-analytics\/assets\/screenshot-3.png?rev=3590336","caption":"Journeys \u2014 page-by-page navigation paths for named, persistent visitors."},{"src":"https:\/\/ps.w.org\/kantan-analytics\/assets\/screenshot-4.png?rev=3590336","caption":"Realtime \u2014 visitors active in the last five minutes with current page and traffic source."},{"src":"https:\/\/ps.w.org\/kantan-analytics\/assets\/screenshot-5.png?rev=3590336","caption":"Settings \u2014 retention, IP exclusion, conversion link rules, and the AI agent download."}],"raw_content":"<!--section=description-->\n<p>Kantan Analytics is a self-hosted WordPress analytics plugin that tracks visitors, sessions, journeys, and conversions \u2014 without cookies, external services, or data ever leaving your server. Every metric lives in your own database. You own it.<\/p>\n\n<p>Kantan keeps every metric in your own database and answers the questions you actually have: which pages convert, where visitors come from, who keeps coming back, and what changed this week. The dashboard installs in a few minutes and runs in the WordPress admin sidebar you already use.<\/p>\n\n<h4>Privacy by architecture<\/h4>\n\n<ul>\n<li><strong>No cookies.<\/strong> Browser localStorage only \u2014 no consent banner required in most jurisdictions, no cross-site tracking possible.<\/li>\n<li><strong>No IP storage.<\/strong> Country and region are resolved from an offline GeoIP database at tracking time; the raw IP is never written to disk.<\/li>\n<li><strong>Nothing phoned home.<\/strong> Every metric stays in your WordPress database and Kantan never sends your data to us. One optional integration \u2014 the Attribution Webhook, off by default \u2014 can forward conversions to a webhook URL you choose (e.g. your own CRM); see the Privacy section.<\/li>\n<li><strong>Configurable retention.<\/strong> Raw session detail purges on the schedule you set (default 90 days). Daily aggregates live in a local SQLite file forever.<\/li>\n<li><strong>Bots and admins filtered.<\/strong> Logged-in admins, common bots, and IPs you specify are excluded before anything is recorded \u2014 your numbers reflect actual humans.<\/li>\n<\/ul>\n\n<h4>What it tracks<\/h4>\n\n<ul>\n<li><strong>Sessions, pageviews, bounce, duration<\/strong> \u2014 trended across any date range, with device, browser, OS, and screen-resolution breakdowns<\/li>\n<li><strong>Traffic sources &amp; UTM capture<\/strong> \u2014 organic, direct, referral, social, paid; UTM parameters captured on first touch and attached to every conversion in the session<\/li>\n<li><strong>Click heatmaps &amp; scroll depth<\/strong> \u2014 recorded per-page, per-element, no external script<\/li>\n<li><strong>User journeys with named visitors<\/strong> \u2014 every visitor gets a persistent ID and a generated three-part name (e.g. \"Roaming Copper Wren\") so long journeys are actually legible across return visits<\/li>\n<li><strong>Page-to-page flow<\/strong> \u2014 see exactly which path your best visitors walk, and where the rest drop off<\/li>\n<li><strong>Conversion tracking<\/strong> \u2014 phone, email, directions, bookings, plus auto-detection of form submissions from Contact Form 7, WPForms, Gravity Forms, Formidable, Ninja Forms, Forminator, and others<\/li>\n<li><strong>Long-term aggregate storage<\/strong> \u2014 daily totals kept indefinitely in a local SQLite file even when raw rows are purged on schedule, so five-year trend lines don't require holding five years of personal data<\/li>\n<\/ul>\n\n<h4>AI-readable analytics<\/h4>\n\n<p>Kantan ships with a downloadable AI agent that reads your data through the WordPress REST API using an application password you generate. Ask it questions in plain English \u2014 \"Which conversions came from organic traffic last month?\", \"Who are my five most engaged returning visitors?\", \"Draft me a paragraph about this week's biggest spike.\" It reads; you approve. Nothing it sees leaves your terminal unless you ask.<\/p>\n\n<h4>Built for self-hosting<\/h4>\n\n<ul>\n<li><strong>Free forever<\/strong>, GPL v2<\/li>\n<li>No accounts, no signups, no SaaS dashboard<\/li>\n<li>Runs on any standard WordPress install (5.0+, PHP 7.0+)<\/li>\n<li>~2 MB plugin, 5\u201350 MB\/year of data depending on traffic<\/li>\n<li>Extensible sidebar tab system \u2014 companion plugins like Kantan SEO snap in alongside the analytics tabs<\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<p>Kantan Analytics is built to collect the minimum needed to give you useful visitor insight, and to keep all of it on your own server.<\/p>\n\n<p><strong>What is recorded:<\/strong> page views, click positions (as percentages, not pixels), scroll depth, in-session navigation paths, traffic source and referrer, UTM parameters, conversions (form submissions, phone\/email\/directions clicks), and approximate device, browser, operating system, and screen resolution parsed from the request.<\/p>\n\n<p><strong>What is not recorded:<\/strong> Kantan does not set cookies and does not store visitor IP addresses. Country and region are resolved from an offline database at the moment of the visit, after which the raw IP is discarded. No data is ever transmitted to Kantan or the plugin author.<\/p>\n\n<p><strong>Optional data sharing (off by default):<\/strong> The Attribution Webhook is the only feature that can send data off your server, and it is disabled until you turn it on. When you enable it and provide a destination URL, Kantan forwards each conversion event \u2014 with any UTM\/campaign and passthrough parameters you've allow-listed \u2014 to that endpoint, which is typically your own CRM or marketing-automation tool. You choose whether to enable it and where the data goes; nothing is sent until you do.<\/p>\n\n<p><strong>Retention:<\/strong> detailed session records are deleted automatically after a configurable window (default 90 days). Only anonymous daily aggregate totals are retained beyond that, in a local SQLite file.<\/p>\n\n<p><strong>Disclosure helper:<\/strong> Kantan registers suggested text with WordPress' built-in Privacy Policy tool (Settings \u2192 Privacy), so you can add an accurate disclosure to your site's policy in one click.<\/p>\n\n<h3>Support<\/h3>\n\n<p>Questions, bugs, or feature requests? Email hello@trykantan.com \u2014 or use the <strong>Support &amp; Bug Reports<\/strong> card in the dashboard's Settings tab, which pre-fills your plugin, WordPress, and PHP versions plus your site URL so we can help faster. We read every message.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install it through the Plugins screen in WordPress.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>The database tables are created automatically on activation.<\/li>\n<li>View your analytics at Analytics in the admin menu.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20use%20cookies%3F\"><h3>Does this use cookies?<\/h3><\/dt>\n<dd><p>No. Kantan uses browser localStorage to recognise returning visitors, never cookies. No consent banner is required in most jurisdictions, and no cross-site tracking is possible.<\/p><\/dd>\n<dt id=\"where%20is%20the%20data%20stored%3F\"><h3>Where is the data stored?<\/h3><\/dt>\n<dd><p>All data is stored in your WordPress database in <code>wp_kantan_*<\/code> tables, with daily aggregates in a local SQLite file under <code>wp-content\/uploads\/kantan\/<\/code>. Nothing is sent to external servers.<\/p><\/dd>\n<dt id=\"how%20is%20traffic%20source%20detected%3F\"><h3>How is traffic source detected?<\/h3><\/dt>\n<dd><p>The tracking script categorizes referrers automatically:<\/p>\n\n<ul>\n<li>Organic: Google, Bing, Yahoo, DuckDuckGo, Baidu<\/li>\n<li>Social: Facebook, Twitter, Instagram, LinkedIn, Pinterest, TikTok<\/li>\n<li>Referral: Other external sites<\/li>\n<li>Direct: No referrer or same domain<\/li>\n<\/ul>\n\n<p>UTM parameters override referrer-based detection when present, and they stay attached to the visitor through every page and conversion in the session.<\/p><\/dd>\n<dt id=\"does%20this%20slow%20down%20my%20site%3F\"><h3>Does this slow down my site?<\/h3><\/dt>\n<dd><p>No. The tracking script loads asynchronously after page content and uses <code>sendBeacon<\/code> for exit tracking. There are no blocking requests, no third-party domains, and no external CDNs. Performance impact is well under 10ms.<\/p><\/dd>\n<dt id=\"is%20this%20gdpr%20%2F%20ccpa%20%2F%20eprivacy%20compliant%3F\"><h3>Is this GDPR \/ CCPA \/ ePrivacy compliant?<\/h3><\/dt>\n<dd><p>Kantan is designed for privacy-first compliance under modern privacy law: no cookies, no IP storage, no cross-site tracking, and \u2014 unless you switch on the optional Attribution Webhook \u2014 no data leaves your server. In most jurisdictions you do not need a consent banner to use it. We're not lawyers \u2014 confirm with yours \u2014 but architecturally the tool is built for privacy-first compliance rather than retrofitting it.<\/p><\/dd>\n<dt id=\"will%20this%20work%20with%20caching%20plugins%20%28wp%20rocket%2C%20w3%20total%20cache%2C%20etc.%29%3F\"><h3>Will this work with caching plugins (WP Rocket, W3 Total Cache, etc.)?<\/h3><\/dt>\n<dd><p>Yes. The tracking script is loaded via standard <code>wp_enqueue_script<\/code> and runs client-side, so cached pages still record visits correctly. The only thing to watch for is plugins that delay or defer JavaScript so aggressively that visitors leave before the script fires \u2014 exclude <code>kantan-analytics\/assets\/tracking.js<\/code> from any \"delay JS until interaction\" rule and you'll be fine.<\/p><\/dd>\n<dt id=\"can%20i%20import%20data%20from%20google%20analytics%3F\"><h3>Can I import data from Google Analytics?<\/h3><\/dt>\n<dd><p>Not currently. Kantan starts tracking the moment you activate it, and historical GA data has a different structure that doesn't map cleanly. If GA\u2192Kantan import is something you need, drop us a note at https:\/\/trykantan.com.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20deactivate%20the%20plugin%3F\"><h3>What happens to my data if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>Nothing \u2014 your data stays in the database. Deactivating just stops new tracking and hides the dashboard. If you uninstall (delete) the plugin, the tables remain unless you explicitly drop them; this is standard WordPress behavior and lets you reactivate without losing history.<\/p><\/dd>\n<dt id=\"how%20do%20i%20exclude%20my%20own%20visits%2C%20or%20specific%20staff%20ips%3F\"><h3>How do I exclude my own visits, or specific staff IPs?<\/h3><\/dt>\n<dd><p>Logged-in admins are excluded by default. The Settings tab also lets you exclude specific IP addresses (one per line). Common bot user-agents are filtered automatically.<\/p><\/dd>\n<dt id=\"what%27s%20the%20ai%20agent%3F\"><h3>What's the AI agent?<\/h3><\/dt>\n<dd><p>A downloadable <code>.md<\/code> file from the dashboard that turns any AI coding agent (Claude Code, Gemini CLI, and compatible tools) into a read-only analyst for your site. It uses a WordPress application password you generate, calls the REST API, and answers questions in plain English. It only reads \u2014 nothing it sees leaves your terminal unless you ask.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20wordpress%20multisite%3F\"><h3>Does this work with WordPress multisite?<\/h3><\/dt>\n<dd><p>Yes \u2014 install at the network level or per-site. Each site gets its own tables and its own dashboard. There's no aggregated network-wide view yet; that's on the roadmap.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.20.1<\/h4>\n\n<ul>\n<li>Security: the excluded-IPs and data-retention settings endpoints now require administrator access even for read requests.<\/li>\n<li>Change: the admin dashboard's tooltip styles are now enqueued as a stylesheet instead of inlined.<\/li>\n<\/ul>\n\n<h4>2.20.0<\/h4>\n\n<ul>\n<li>Hardening: every visitor-tracking, UTM, conversion, and form input is now unslashed and sanitized at the point it is read, and the values forwarded to integration hooks are sanitized arrays rather than the raw request.<\/li>\n<li>Security: diagnostics and configuration endpoints (status, conversion links, attribution webhook config) now require administrator access even for read requests.<\/li>\n<li>Change: all admin and front-end JavaScript is enqueued through WordPress \u2014 no inline script tags remain.<\/li>\n<li>Change: bundled Chart.js updated to 4.5.1.<\/li>\n<\/ul>\n\n<h4>2.19.0<\/h4>\n\n<ul>\n<li>Hardening: comprehensive output escaping across the admin dashboard, timezone-safe date handling, and URL parsing through WordPress core wrappers \u2014 aligning the plugin with the official WordPress.org plugin coding standards.<\/li>\n<li>Change: minimum supported WordPress raised to 5.6.<\/li>\n<li>Docs: clarified the privacy documentation to disclose the optional Attribution Webhook, which sends conversion data to a CRM endpoint you configure \u2014 and only when you enable it.<\/li>\n<\/ul>\n\n<h4>2.18.0<\/h4>\n\n<ul>\n<li>New: Business Profile \u2014 a canonical, editable record of your business facts (hours, offerings, address\/phone, brand voice, claims to make or avoid) under Settings \u2192 Business Profile. The downloadable AI agents now read it as ground truth before writing or rewriting content, so generated copy uses real facts and your voice instead of guessing. Your agent can even draft it from your site (\"Draft my business profile\"), and it's the same source of truth for both the Analytics and SEO agents.<\/li>\n<\/ul>\n\n<h4>2.17.0<\/h4>\n\n<ul>\n<li>New: Attribution Webhook \u2014 send every conversion to your email\/CRM platform (HubSpot, GoHighLevel, Salesforce, Zapier, Make, and more) with its first-party campaign + journey attribution, keyed by an anonymous visitor id. HMAC-signed; no personal data leaves your site. Set it up under Settings \u2192 Attribution Webhook \/ CRM, with a one-click \"Send test\".<\/li>\n<li>New: passthrough parameter capture \u2014 Kantan now captures ad-click and CRM contact ids from inbound links (gclid, fbclid, msclkid, contact_id, mkt_tok and ~45 more) and includes them in the webhook, so your CRM can join the conversion to the right contact. The captured params are stripped from stored URLs.<\/li>\n<\/ul>\n\n<h4>2.16.1<\/h4>\n\n<ul>\n<li>Improved: the downloadable AI agent now officially documents Gemini CLI alongside Claude Code (it's the same Markdown format \u2014 drop it in ~\/.claude\/agents\/ or ~\/.gemini\/agents\/). The agent self-updates to this broadened version automatically.<\/li>\n<li>Improved: \"Ask the agent\" prompts now copy with the agent name prefixed, so the pasted prompt delegates to the right Kantan agent. Wording across the agent download is now tool-neutral.<\/li>\n<li>New: a \"What about Codex?\" explainer on the agent download covering why OpenAI Codex isn't officially supported yet (and how to use Kantan with it today).<\/li>\n<\/ul>\n\n<h4>2.16.0<\/h4>\n\n<ul>\n<li>New: Scroll Depth by Page \u2014 the Interactions tab now breaks scroll depth down per page (with a visual bar), so you can see which pages get read versus abandoned instead of just a site-wide average.<\/li>\n<li>New: click a visitor's name on the Realtime tab (or in Visitor Profiles) to open their full visit history \u2014 every session, the pages they walked, durations, and conversions.<\/li>\n<\/ul>\n\n<h4>2.15.0<\/h4>\n\n<ul>\n<li>New: Interactions drill-downs \u2014 click any Click Region to see exactly which elements were clicked there and on which pages, and click any row in Top Clicked Elements for its per-page breakdown.<\/li>\n<li>Improved: click tracking now records the actual link\/button clicked (not the inner span or icon) with a clean, accessible-name-first label, and no longer captures whole-page text from stray clicks. Top Clicked Elements merges the same control across pages and filters out container\/no-text noise \u2014 so the report finally reflects what visitors actually click.<\/li>\n<\/ul>\n\n<h4>2.14.1<\/h4>\n\n<ul>\n<li>New: Top Referrers detail modal \u2014 click any referrer on the Overview dashboard to see its sessions, visitors, daily trend, landing pages, the exact referring URLs, and recent visitors.<\/li>\n<li>New: the Claude Code agent now keeps itself up to date \u2014 it checks for a newer version about once a week and refreshes in place, with no re-download and without ever rotating your API key. Added an \"Update agent file\" button and clearer \"install once, use on every site\" guidance.<\/li>\n<\/ul>\n\n<h4>2.14.0<\/h4>\n\n<ul>\n<li>New: \"Ask the agent\" \u2014 a sparkle icon on dashboard data blocks (referrers, traffic sources, pages, journeys, interactions, devices, conversions) opens a modal of copy-paste, data-specific prompts for the Claude agent.<\/li>\n<li>New: AI-assistant referral attribution \u2014 visits are identified from utm_source as well as the referrer (catching empty-referrer ChatGPT\/Perplexity\/Claude links) and split per assistant; the Overview AI card shows the per-assistant breakdown.<\/li>\n<li>Fixed: Overview KPI cards lay out cleanly as 3-up \/ 2-up on laptop screens.<\/li>\n<\/ul>\n\n<h4>2.13.1<\/h4>\n\n<ul>\n<li>New: an \"AI Assistants\" KPI card with sparkline on the Overview dashboard \u2014 shows visits referred by AI assistants and their share of total traffic at a glance.<\/li>\n<\/ul>\n\n<h4>2.13.0<\/h4>\n\n<ul>\n<li>New: AI assistants (ChatGPT, Perplexity, Claude, Gemini, Copilot and more) are now a first-class traffic source. Visits referred by them are tracked and shown as their own \"AI Assistants\" category across Traffic Sources, sessions, the realtime tab, and conversions. Existing AI-referred visits are reclassified automatically on upgrade.<\/li>\n<li>New: the Claude Code agent gained an \"AI Assistant Referral Traffic\" workflow and an \"Am I getting AI traffic yet?\" starter prompt.<\/li>\n<\/ul>\n\n<h4>2.12.1<\/h4>\n\n<ul>\n<li>New: a \"Support &amp; Bug Reports\" card in Settings \u2014 a one-click email link that pre-fills your plugin, WordPress, and PHP versions plus your site URL, so reports arrive with the diagnostics we need to help. Settings and Support links now also appear in the WordPress plugins list.<\/li>\n<\/ul>\n\n<h4>2.12.0<\/h4>\n\n<ul>\n<li>Fixed: the agent download dialog now caps its height and scrolls on short\/laptop screens instead of overflowing off-screen.<\/li>\n<li>New: starter prompts in the Claude Code agent download \u2014 copy-to-clipboard example prompts (30-day summary, best\/worst content, traffic-source ROI, visitor journeys) appear in the credentials modal and are written into the generated agent .md.<\/li>\n<\/ul>\n\n<h4>2.11.5<\/h4>\n\n<ul>\n<li>Fixed: clicking a page row now opens the page-detail modal on every tab. The click handler was previously only present on the Overview tab, so page rows on Pages, Journeys, and the SEO tabs showed a hover state but did nothing when clicked.<\/li>\n<li>Fixed: the \"Visits Over Time\" chart on the Overview tab could render blank \u2014 the canvas had no sized container, so Chart.js collapsed it to zero height. It now renders in a fixed-height container.<\/li>\n<li>Fixed: IP exclusion and visitor IP logging now resolve the real client address through reverse-proxy\/CDN headers (Cloudflare, nginx, load balancers) instead of always using the proxy's own address. On proxied sites the \"Your current IP\" box previously showed a private hop (e.g. 127.0.0.1 or 192.168.x.x), and excluding it had no effect. When only a local\/private address is available, the box now flags it and links to an external IP lookup.<\/li>\n<\/ul>\n\n<h4>2.11.4<\/h4>\n\n<ul>\n<li>New: optional read-only dashboard access. A user granted the <code>kantan_view_dashboard<\/code> capability can view the dashboard and its data without <code>manage_options<\/code> \u2014 every write, scan, and sync still requires <code>manage_options<\/code>. The dashboard menu capability is filterable via <code>kantan_dashboard_capability<\/code>. Inert on normal sites; powers a public read-only demo.<\/li>\n<\/ul>\n\n<h4>2.11.3<\/h4>\n\n<ul>\n<li>Security\/clarity: the Claude Code agent download now states plainly that the generated Application Password grants the full API access of your account (not read-only), with guidance to keep the file out of version control and how to revoke the password under Users \u2192 Profile \u2192 Application Passwords.<\/li>\n<li>Added: an <code>Update URI<\/code> header so the \"Enable auto-updates\" toggle appears for Kantan Analytics in the Plugins list. (The WordPress.org build omits this header so wp.org continues to own updates there.)<\/li>\n<\/ul>\n\n<h4>2.11.1<\/h4>\n\n<ul>\n<li>Removed: Conversion Backfill tool in Settings \u2014 the underlying hostname-matching bug it patched was fixed back in 2.9.8, so the catch-up tool is no longer needed. The REST endpoint, dashboard UI, and <code>_backfill<\/code> conversion-type display shim have all been removed.<\/li>\n<\/ul>\n\n<h4>2.11.0<\/h4>\n\n<ul>\n<li>New: Conversions tab \u2014 see your conversions by type and by traffic source, with a recent-conversion log, right in the dashboard. Surfaces the conversion data Kantan already tracks via Settings \u2192 Conversion Links.<\/li>\n<li>Dashboard assets (Tailwind CSS and Chart.js) are now bundled with the plugin instead of loaded from a CDN \u2014 the admin dashboard makes no third-party requests and works fully offline.<\/li>\n<li>New: Kantan contributes suggested text to WordPress' built-in Privacy Policy generator (Settings \u2192 Privacy), reflecting your configured data-retention window.<\/li>\n<\/ul>\n\n<h4>2.10.0<\/h4>\n\n<ul>\n<li>New: Realtime tab \u2014 shows visitors active in the last 5 minutes with their current page, traffic source, session age, and \"last seen\" age. Auto-refreshes every 30 seconds with a visible countdown and a manual \"Refresh now\" button. Pauses polling when the browser tab is hidden.<\/li>\n<li>New: Live visitor count badge next to the \"Realtime\" item in the dashboard nav. Visible from every tab \u2014 the same 30s poll that drives the Realtime tab also keeps the badge current, with a pulsing green dot when at least one visitor is active.<\/li>\n<li>New: REST endpoint <code>GET \/kantan\/v1\/realtime?window=5<\/code> \u2014 returns <code>{ count, window_minutes, visitors, timestamp }<\/code>. Each visitor row includes the most recent pageview (current page), generated display name, traffic source, session age, and seconds since last activity.<\/li>\n<\/ul>\n\n<h4>2.9.9<\/h4>\n\n<ul>\n<li>New: UTM parameters now surface on the Journeys tab alongside each named visitor's session timeline \u2014 see campaign, source, and medium for pre-conversion visits (previously only visible aggregated on the UTM tab). REST <code>\/visitors<\/code> and <code>\/journeys<\/code> endpoints also expose the new fields, so the Claude Code agent and recommendations engine can attribute behavior to campaigns.<\/li>\n<\/ul>\n\n<h4>2.9.8<\/h4>\n\n<ul>\n<li>Fix: conversion link matching corrected \u2014 hostname was being searched inside the full URL string (always -1); now checks href.startsWith(rule.domain) OR rule.domain contains hostname. Affected all conversion link click tracking since the feature launched.<\/li>\n<li>New: Conversion Backfill tool added to Settings. Scans historical click data and creates approximate conversion records for sessions likely missed by the bug. Matches anchor text against each rule's label; backfilled records carry a <code>_backfill<\/code> type suffix. Idempotent \u2014 safe to run multiple times.<\/li>\n<\/ul>\n\n<h4>2.9.7<\/h4>\n\n<ul>\n<li>Author renamed from \"Kinda Useful Plugins\" to \"Try Kantan\" across plugin header, readme, and updater comment.<\/li>\n<li>readme description and FAQ rewritten \u2014 full feature pitch with subsection structure; FAQ expanded from 4 to 10 items (caching, GDPR\/CCPA, GA import, deactivation, multisite, agent, etc.).<\/li>\n<\/ul>\n\n<h4>2.9.6<\/h4>\n\n<ul>\n<li>Fix: conversions endpoint now returns correct visitor_id for pre-2.9.4 records; query uses COALESCE(c.visitor_id, a.visitor_id) to recover attribution from the joined session record when the conversion row has a null visitor_id.<\/li>\n<li>Fix: version constant bumped to match header (was stuck at 2.9.4).<\/li>\n<\/ul>\n\n<h4>2.9.5<\/h4>\n\n<ul>\n<li>Sidebar nav groups now accordion \u2014 clicking a group label collapses or expands it. The active group always starts expanded; inactive groups start collapsed. Keeps the nav usable on laptops when many SEO sub-tabs are registered.<\/li>\n<\/ul>\n\n<h4>2.9.4<\/h4>\n\n<ul>\n<li>Persistent visitor attribution for conversions: <code>visitor_id<\/code> column added to <code>wp_kantan_conversions<\/code> so attribution survives beyond the 90-day raw-data retention window.<\/li>\n<li>Form integrations now inject <code>kantan_visitor_id<\/code> alongside <code>kantan_session_id<\/code> on all detected forms (CF7, WPForms, Gravity, Formidable, Ninja, Elementor Pro, Fluent, Forminator).<\/li>\n<li>Schema migration runs automatically on update \u2014 no manual action required.<\/li>\n<\/ul>\n\n<h4>2.9.3<\/h4>\n\n<ul>\n<li>Update channel migrated to trykantan.com. Plugin URIs, SEO upgrade link, and auto-updater endpoint now point to the new domain.<\/li>\n<\/ul>\n\n<h4>2.9.0<\/h4>\n\n<ul>\n<li>New: Split test tracking integration \u2014 pageviews can now record <code>test_id<\/code> and <code>variant_id<\/code> from a companion split-testing plugin.<\/li>\n<li>New: <code>kantan_pageview_tracked<\/code> action hook fired after each pageview insert.<\/li>\n<li>Database migration to add <code>test_id<\/code> and <code>variant_id<\/code> columns to the pageviews table.<\/li>\n<\/ul>\n\n<h4>2.8.0<\/h4>\n\n<ul>\n<li>New: Clickable page URLs throughout dashboard \u2014 opens SEO page detail modal or upsell.<\/li>\n<li>New: Sparkline mini-charts on Overview stat cards.<\/li>\n<li>Surface recommendations engine on Overview, Interactions, and Journeys tabs.<\/li>\n<\/ul>\n\n<h4>2.7.0<\/h4>\n\n<ul>\n<li>New: IP address exclusion for analytics filtering.<\/li>\n<li>Rebuilt Journeys tab with visitor profiles and generated names.<\/li>\n<\/ul>\n\n<h4>2.6.0<\/h4>\n\n<ul>\n<li>New: Admin exclusion and bot filtering.<\/li>\n<li>New: Interactions endpoint for click heatmap and scroll depth data.<\/li>\n<li>New: Device breakdown endpoint and queries.<\/li>\n<li>Switched dashboard to left sidebar nav with grouped tabs.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>New: Click tracking, scroll depth tracking, and user journey analysis.<\/li>\n<li>New: Entry\/exit page tracking and top-clicked-elements report.<\/li>\n<li>New: Automatic daily cleanup with configurable retention.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: core visitor tracking and admin dashboard.<\/li>\n<\/ul>","raw_excerpt":"Lightweight, self-hosted analytics with click tracking, scroll depth, and user journey visualization. No cookies, no external services.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/329075","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=329075"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/inglewood"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=329075"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=329075"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=329075"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=329075"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=329075"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=329075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}