WP Manifestindependent plugin directory
manifest / analytics / wp-honest-analytics

Honest Analytics releases

Honest Analytics - privacy-first analytics for WordPress. Cookieless by default, aggregate-only storage, no third-party requests.

by Coysh Digital · github.com/coysh-digital/wp-honest-analytics · website

1stars
20release downloads
0forks

Install

The author publishes release zips, so WP-CLI can install straight from GitHub:

wp plugin install https://github.com/coysh-digital/wp-honest-analytics/releases/download/v0.9.6/honest-analytics-0.9.6.zip

Readme

Honest Analytics

Privacy-first, cookieless analytics for WordPress. No third-party service, no addresses, no per-visitor rows.

A WordPress port of Craft Analytics, built by Coysh Digital.


What it does

Counts your traffic - pages, sources, devices, content - and shows it in the WordPress admin, without sending anything anywhere and without storing anything that could identify a visitor later.

It works behind full-page caches. It works with content blockers. It works without JavaScript, in a reduced form. It works without paying for anything.

Here is the dashboard - traffic, channels, devices, and when people visit, all in the WordPress admin:

The Honest Analytics dashboard

What it does not do

  • Call a third party while it counts. Not for analytics, not for fonts, not for map tiles, not for telemetry. The only outbound call is one you start: importing your history from Google Analytics. It can also answer a reporting tool you connect to it, which stays off until you paste in a connection code.
  • Store an address. Not in a table, not in a log, not in a cache key, not in the write spool.
  • Store a full referrer URL or a full user-agent string. Both are reduced in the request that saw them - to an origin, and to four device families - so neither reaches the spool either.
  • Store a raw pageview. A hit waits in the write spool for a few minutes and is folded into counters; nothing keeps one afterwards.
  • Set a cookie. This edition has no feature that sets one, consented or otherwise.
  • Count a visitor who sent Sec-GPC: 1.

How it counts people without identifying them

A visitor is a 16-character hash of a random daily salt, the address, the user agent and the site. The salt is overwritten in place every 24 hours, so yesterday's hashes cannot be recomputed by anyone - including someone holding the database and the address.

Uniqueness is estimated from a fixed-size HyperLogLog sketch on the rollup row, accurate to about ±1.6%. The sketch cannot be asked whether it contains a particular person; it holds no identifiers.

This is why "unique visitors" means daily uniques, and why the interface says so everywhere the number appears.

How it survives a page cache

The server counts requests it sees. A 1.8 KB first-party tracker confirms the rest. A nonce reconciles the two - consumed once per visitor, not once per nonce, so one piece of cached HTML served to a thousand people counts a thousand times, and one visitor reloading counts once.

No cache exclusions, no hole punching, no cache-plugin add-on.

Storage

Growth is dimensions × time, not pageviews × time. A site with a hundred thousand views a day and one with a hundred use roughly the same disk, because both write one row per hour per dimension. Around 110,000 events fit in about 15 MB.

Screens

Dashboard · Real-time · Pages · Page detail · Content · Sources · Devices · Privacy · Settings · Import data · Reporting API.

Every one of them is in this edition, with no row caps, no retention caps, no date-range caps and nothing that expires. A privacy-first analytics plugin that will not tell you your top pages without payment is not a privacy-first analytics plugin.

Campaigns, locations, events, goals, funnels, crawler reporting, shareable client report links, Search Console queries, scheduled email summaries and the form and commerce integrations are in the paid edition. None of that code is in this repository: it is removed when this edition is packaged, so there is no key to enter and nothing here to unlock.

Install

WordPress 6.4+, PHP 8.1+, MySQL 5.7+ or MariaDB 10.4+.

The free edition is distributed on wordpress.org: Plugins → Add New, search for Honest Analytics, Install Now, Activate. The paid edition is a direct download, installed through Plugins → Add New → Upload Plugin.

Either way, activate and visit Analytics. Then set up scheduling, because a cached site needs a real cron schedule for the aggregation to keep up.

Full instructions are in the documentation.

Documentation

Full documentation lives at honest-analytics.com/docs - installation and first run, scheduling and health checks, how cached pages are counted, exactly what is stored and how to verify it, importing your history, retention and growth, uninstalling, and the architecture decisions behind it all.

WP-CLI

Optional, every one of them. Nothing the plugin needs doing requires a terminal: maintenance runs from buttons on Settings, and counting works on hosts with no cron at all. WP-CLI is there for people who prefer it and for scripting.

wp honest-analytics info
wp honest-analytics drain [--retry] [--watch] [--network] [--quiet]
wp honest-analytics gc [--dry-run] [--quiet]
wp honest-analytics salt rotate
wp honest-analytics salt status
wp honest-analytics privacy posture
wp honest-analytics privacy export --user-id=<id> [--format=json]
wp honest-analytics privacy erase --visitor-id=<hash>
wp honest-analytics report [<kind>] [--range=30d] [--limit=20] [--format=csv]
wp honest-analytics seed --days=400 --per-day=520 --content --force

Checking the claims

# The write spool, before aggregation. No address, no user agent, and a
# referrer reduced to its origin.
cat wp-content/uploads/honest-analytics/spool/*.ndjson | head

# Rotate the salt, and watch every identity cease to exist.
wp honest-analytics salt rotate

The claim is also tested rather than asserted. NoIpPersistedTest drives a request with a known address and then searches every table, the key-value store, the spool and the debug log for it, failing the build if it finds it. The suite is not part of a distribution, so it lives in the development repository rather than here.

Licence

GPL-2.0-or-later. See LICENSE.md and licenses/THIRD-PARTY-LICENSES.md.

Read the full README on GitHub →

Releases

TagPublishedAssetDownloads
v0.9.6 Sep 7, 2026 honest-analytics-0.9.6.zip 1
v0.9.5 Sep 7, 2026 honest-analytics-0.9.5.zip 2
v0.9.4 Sep 7, 2026 honest-analytics-0.9.4.zip 2
v0.9.3 Sep 7, 2026 honest-analytics-0.9.3.zip 2
v0.9.2 Sep 2, 2026 honest-analytics-0.9.2.zip 1
v0.9.1 Sep 2, 2026 honest-analytics-0.9.1.zip 3
v0.9.0 Sep 1, 2026 honest-analytics-0.9.0.zip 2
v0.8.5 Aug 26, 2026 honest-analytics-0.8.5.zip 3
v0.8.4 Aug 25, 2026 honest-analytics-0.8.4.zip 1
v0.8.3 Aug 24, 2026 honest-analytics-0.8.3.zip 0
v0.5.0 Aug 22, 2026 honest-analytics-0.5.0.zip 0
v0.4.0 Aug 22, 2026 honest-analytics-0.4.0.zip 0
v0.3.0 Aug 22, 2026 honest-analytics-0.3.0.zip 0
v0.2.3 Aug 22, 2026 honest-analytics-0.2.3.zip 0
v0.2.2 Aug 22, 2026 honest-analytics-0.2.2.zip 0
v0.2.1 Aug 22, 2026 honest-analytics-0.2.1.zip 0
v0.2.0 Aug 22, 2026 honest-analytics-0.2.0.zip 1
v0.1.1 Aug 21, 2026 honest-analytics-0.1.1.zip 0
v0.1.0 Aug 21, 2026 honest-analytics-0.1.0.zip 2