New: added an optional previous-period comparison line to the main dashboard chart. You can compare the last 7 days with the previous 7 days, the last 30 days with the previous 30 days, or today with yesterday using the new “Compare previous period” checkbox.
Changed: renamed the “New vs Returning” widget to “New vs Repeat” to better match the privacy model. “Repeat” now means visitors with more than one session in the same day. Cross-day returning visitors are not tracked because fingerprints rotate daily for privacy. Added an info tooltip to explain this.
Improved: faster dashboard loading on busy sites. Added a covering database index for country and city geography queries, so they no longer need to scan the full hits table on each load.
1.2.2
Visitor fingerprint salt now rotates every 24 hours at midnight UTC. The same visitor returning the next day is counted as a new unique visitor — the privacy-first standard for consent-free analytics. This aligns the plugin with the EDPB Guidelines 2/2023 reading of ePrivacy Article 5(3) and the CNIL audience-measurement criteria (July 2025), which require fingerprints to have a “limited lifespan”. Why this matters: the prior static salt produced a fingerprint that persisted for months, which made the “no consent banner” posture harder to defend in the EU. After this change the plugin matches the privacy-by-design industry standard.
Expected impact on numbers: the “Returning Visitors” share in New vs Returning will drop, because cross-day returns are no longer detected — only same-day returns count as returning. Within a single day, visitor counts are unchanged. This is a deliberate privacy trade-off, not a bug.
Updated author description in the plugin readme to reflect current site direction.
1.2.1
Fixed the device breakdown (“Devices” widget on the Overview tab) showing “No device data yet” even when device data existed.
Tested up to WordPress 7.0.
1.2.0
Geolocation now runs entirely on your own server. The plugin downloads a public IP geolocation database (DB-IP City Lite, CC-BY 4.0) from jsDelivr CDN about once a month and resolves visitor country and city locally. Visitor IP addresses are never sent to a third-party service.
New “External services” section in the readme documents every outbound request the plugin can make.
Settings → General gains a “Geolocation” toggle (on by default) that fully disables external traffic when off, and an “Update database now” button with a status block (Ready / Outdated / Downloading / error states).
Privacy disclosure page lists DB-IP and jsDelivr with the source URL, license, and a one-click way to disable.
Defeated stale-data caching across LiteSpeed Cache (private tier), Cloudflare APO, BunnyCDN, Varnish, Fastly, Akamai, nginx FastCGI and the WordPress object cache. Dashboard now reads fresh data on every load.
Dashboard JS in-memory cache now expires after 30 seconds instead of forever.
Asset URLs versioned via plugin version (matches WP core convention) so version bumps invalidate browser disk-cache cleanly.
Fixed map gradient legend showing duplicate “1” labels for sites with a single visitor.
1.1.1
Fixed AJAX action names for the tracker fallback, custom event tracking, Clear All Data form and the test-email button (hooks were still registered under the old prefix after the 1.1.0 rename)
Shipped unminified JavaScript and CSS sources alongside the minified bundles
Moved third-party notices into the readme
1.1.0
Renamed to ZenMarkup Privacy Analytics
Internal prefix migration (classes, functions, options, CSS, data attributes) to meet WordPress.org naming requirements
Rewrote plugin description in neutral, non-comparative tone
No functional changes — all features from 1.0.0 preserved