{"id":386735,"date":"2026-10-14T12:50:22","date_gmt":"2026-10-14T12:50:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/statinform-cookieless-analytics-no-consent-banner\/"},"modified":"2026-10-14T12:50:14","modified_gmt":"2026-10-14T12:50:14","slug":"statinform","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/statinform\/","author":23583246,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Statinform: Cookieless Analytics (No Consent Banner)","header_author":"einform","header_description":"Lightweight, privacy-friendly analytics for WordPress. No cookies, no external services, minimal server load.","assets_banners_color":"","last_updated":"2026-10-14 12:50:14","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/e-inform.by","rating":0,"author_block_rating":0,"active_installs":0,"downloads":70,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"einform","date":"2026-10-14 12:50:14","revision":3746382}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3746351,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3746351,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3746351,"resolution":"1","location":"assets","locale":"","width":1200,"height":750}},"screenshots":{"1":"Overview dashboard with today's summary."}},"plugin_section":[],"plugin_tags":[232,4035,189910,396,521],"plugin_category":[36,54],"plugin_contributors":[286752],"plugin_business_model":[],"class_list":["post-386735","plugin","type-plugin","status-publish","hentry","plugin_tags-analytics","plugin_tags-lightweight","plugin_tags-no-cookies","plugin_tags-privacy","plugin_tags-statistics","plugin_category-analytics","plugin_category-security-and-spam-protection","plugin_contributors-einform","plugin_committers-einform"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/statinform\/assets\/icon-128x128.png?rev=3746351","icon_2x":"https:\/\/ps.w.org\/statinform\/assets\/icon-256x256.png?rev=3746351","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/statinform\/assets\/screenshot-1.png?rev=3746351","caption":"Overview dashboard with today's summary."}],"raw_content":"<!--section=description-->\n<p>StatInform is a self-hosted analytics plugin for WordPress that keeps all data on your own server. It does <strong>not<\/strong> use cookies, does <strong>not<\/strong> send data to third parties (Google, Yandex, or anyone else), and has a minimal impact on your site's performance.<\/p>\n\n<p><strong>Key features<\/strong><\/p>\n\n<ul>\n<li><strong>No cookies.<\/strong> Session identification uses <code>sessionStorage<\/code>, which is cleared when the browser tab closes. No long-lived identifiers, no cross-visit tracking.<\/li>\n<li><strong>No external services.<\/strong> All data is stored in your own MySQL database. Nothing is sent anywhere.<\/li>\n<li><strong>Minimal server load.<\/strong> The collection endpoint runs outside of WordPress core. It does not load <code>wp-load.php<\/code>, does not touch the database, and simply appends a line to a buffer file.<\/li>\n<li><strong>Page-level detail.<\/strong> Tracks entry\/exit pages, full session page chains, time on each page, and transitions between pages.<\/li>\n<li><strong>Source detection.<\/strong> Classifies traffic by referrer and UTM tags. Recognizes search engines, social networks, and messengers (Telegram, WhatsApp, Viber, and others).<\/li>\n<li><strong>Outbound link tracking.<\/strong> Tracks clicks on external links, <code>mailto:<\/code>, and <code>tel:<\/code> links.<\/li>\n<li><strong>Bot filtering.<\/strong> Detects known bots by User-Agent and <code>Accept-Language<\/code> headers.<\/li>\n<li><strong>Bounce rate.<\/strong> A session is a bounce when it has &lt;= 1 unique page and total time &lt; 15 seconds.<\/li>\n<li><strong>Data export.<\/strong> Export any table to CSV for a chosen period. Create ZIP archives on the server. Delete old data with optional pre-archiving.<\/li>\n<li><strong>No cookie consent banner required<\/strong> for this plugin's own data collection, because no cookies are used and no personal data is stored in identifiable form.<\/li>\n<\/ul>\n\n<h3>Performance and architecture<\/h3>\n\n<p>StatInform's collection endpoint intentionally runs outside of WordPress core. This means:<\/p>\n\n<ul>\n<li><strong>No <code>wp-load.php<\/code>.<\/strong> The endpoint is a standalone PHP script. It does not load WordPress, does not connect to the database, and does not fire any hooks.<\/li>\n<li><strong>The endpoint lives in <code>wp-content\/uploads\/eistat\/<\/code>.<\/strong> It is copied there on activation from a template file inside the plugin folder. WordPress.org guidelines require plugins to store user data in <code>uploads\/<\/code>, not in the plugin directory.<\/li>\n<li><strong>No SQL in the collection path.<\/strong> Events are appended to hourly <code>.jsonl<\/code> buffer files. Aggregation into the database happens separately via WP-Cron or the manual \"Update now\" button.<\/li>\n<li><strong>Data files are protected from direct access.<\/strong> <code>.htaccess<\/code> files in the buffer and archives folders block direct HTTP access. On Nginx, these files are ignored and equivalent server-level rules should be configured.<\/li>\n<\/ul>\n\n<h3>Notes for reviewers<\/h3>\n\n<p>A few static-analysis warnings appear when running Plugin Check (PCP) on this plugin. They are false positives:<\/p>\n\n<ol>\n<li><p><strong><code>InterpolatedNotPrepared<\/code> on SQL queries.<\/strong> All queries use <code>$wpdb-&gt;prepare()<\/code> for values. Table names are built as <code>$wpdb-&gt;prefix . 'eistat_'<\/code> and cannot be parameterized through <code>prepare()<\/code>. The table prefix is a controlled value that never comes from user input.<\/p><\/li>\n<li><p><strong><code>NonceVerification.Recommended<\/code> on GET parameters.<\/strong> The admin views read filter parameters (<code>days<\/code>, <code>view<\/code>, <code>date<\/code>, <code>source<\/code>, <code>link_type<\/code>, <code>paged<\/code>) directly from <code>$_GET<\/code>. These are read-only filters that do not change state, so a nonce is not required. All values are sanitized with <code>sanitize_text_field()<\/code>, <code>sanitize_key()<\/code>, or <code>absint()<\/code>.<\/p><\/li>\n<li><p><strong><code>DirectDatabaseQuery<\/code> and <code>NoCaching<\/code>.<\/strong> The plugin uses custom tables with the prefix <code>wp_eistat_<\/code>. These tables are not part of the WordPress object cache, so caching them would provide no benefit.<\/p><\/li>\n<\/ol>\n\n<p>The plugin does <strong>not<\/strong> write any PHP code to user files. The buffer path is stored as plain JSON in <code>uploads\/eistat\/buffer-path.json<\/code> and read with <code>file_get_contents()<\/code> + <code>json_decode()<\/code>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>statinform<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>On activation, the plugin creates six database tables and a data folder at <code>wp-content\/uploads\/eistat\/<\/code> with the following structure:\n\n<ul>\n<li><code>uploads\/eistat\/collect.php<\/code> \u2014 the collection endpoint.<\/li>\n<li><code>uploads\/eistat\/buffer-path.json<\/code> \u2014 a plain JSON config with the buffer directory path.<\/li>\n<li><code>uploads\/eistat\/buffer\/<\/code> \u2014 hourly <code>.jsonl<\/code> files.<\/li>\n<li><code>uploads\/eistat\/archives\/<\/code> \u2014 exported ZIP archives.<\/li>\n<\/ul><\/li>\n<li>Go to <strong>Analytics<\/strong> in the admin menu to view your dashboard.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20statinform%20use%20cookies%3F\"><h3>Does StatInform use cookies?<\/h3><\/dt>\n<dd><p>No. Session identification uses <code>sessionStorage<\/code>, which is cleared when the browser tab is closed. No cookies are set by the tracker.<\/p><\/dd>\n<dt id=\"does%20it%20send%20data%20to%20google%2C%20yandex%2C%20or%20any%20other%20service%3F\"><h3>Does it send data to Google, Yandex, or any other service?<\/h3><\/dt>\n<dd><p>No. All data stays in your own MySQL database on your own server.<\/p><\/dd>\n<dt id=\"is%20a%20cookie%20consent%20banner%20required%3F\"><h3>Is a cookie consent banner required?<\/h3><\/dt>\n<dd><p>For StatInform's own data collection, no - because no cookies are set and no personal data is stored in identifiable form.<\/p><\/dd>\n<dt id=\"does%20it%20slow%20down%20my%20site%3F\"><h3>Does it slow down my site?<\/h3><\/dt>\n<dd><p>The collection endpoint bypasses WordPress core entirely. Each tracked event adds roughly a few milliseconds of server work. Aggregation runs in the background, not during page loads.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Lightweight, privacy-friendly analytics. No cookies, no external services, minimal server load.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/386735","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=386735"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/einform"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=386735"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=386735"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=386735"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=386735"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=386735"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=386735"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}