MilkStats

Beschrijving

MilkStats houdt bezoekersstatistieken bij zonder persoonsgegevens te verzamelen.
Alle data blijft lokaal in je eigen WordPress-database — er wordt niets gedeeld met externe analysediensten (geen Google Analytics, geen externe scripts of lettertypen).
Een product van 5Names.

Wat wordt gemeten?

  • Paginaweergaven — geteld en geaggregeerd per pagina, per dag
  • Sessies — hoeveel unieke bezoekerssessies er waren
  • Tijd op pagina — hoe lang iemand op een pagina bleef
  • Navigatiepaden — welke pagina het vaakst leidt naar welke volgende pagina
  • Sources — did the visitor arrive via a search engine, social media, a
    referring site, an AI assistant, or directly? Plus UTM campaign tags
    (utm_source, utm_medium, utm_campaign) if you use them in your own
    marketing links.
  • Evenementen — klikken op uitgaande links en download links worden automatisch gedetecteerd, plus optionele aangepaste gebeurtenissen via het data-milkstats-event attribuut. Zie “Aangepaste gebeurtenissen” hieronder.
  • AI-crawlerzichtbaarheid — hoe vaak bekende AI-crawlers (GPTBot, ClaudeBot, PerplexityBot, en andere) je site bezoeken, apart van menselijk verkeer.

Wat wordt NOOIT opgeslagen?

  • Geen IP-adressen
  • No tracking cookies — the session ID lives only in the browser’s
    sessionStorage and disappears as soon as the tab is closed. The only
    cookie this plugin can ever set is the optional opt-out cookie described
    below, and only if you or a visitor chooses to set it.
  • Geen browser-fingerprinting
  • No full referrer URLs — only the domain (e.g. “google.com”), never the
    path or a search query that might be contained in it
  • Geen gegevens verzonden naar externe partijen

Hoe werkt het technisch?

On every page view, a small, first-party JavaScript file (assets/tracker.js)
sends an AJAX request to your own admin-ajax.php. That request contains the
page URL, page title, a random session ID, and — only on the first page view
of a session — the hostname of the referring site and any UTM parameters.
When the page is left, the time on page is sent afterwards via
navigator.sendBeacon.

Deze gegevens belanden uiteindelijk in de volgende tabellen in je WordPress database:

  1. wp_milkstats_pageviews — dagelijkse totalen per pagina. Wordt voor onbepaalde tijd bewaard: alleen aantallen, geen sessie-informatie.
  2. wp_milkstats_session_events — individuele paginaweergaven per sessie, met tijd op pagina. Wordt automatisch verwijderd na de ingestelde bewaartermijn.
  3. wp_milkstats_sessions — één rij per sessie met de verkeersbron (first-touch attributie). Wordt ook opgeruimd na de bewaartermijn.
  4. wp_milkstats_events — aangepaste events (uitgaande linkklikken, downloads,
    handmatige gebeurtenissen). Opgeschoond na de bewaartermijn, net als sessie gegevens.
  5. wp_milkstats_device_stats — daily aggregated device/browser/OS counts.
    Kept indefinitely, like page totals — never traceable to an individual.
  6. wp_milkstats_ai_crawler_hits — dagelijkse geaggregeerde hits van bekende AI-crawlers. Wordt voor onbepaalde tijd bewaard, net als paginatotalen.

Een dagelijkse WP-Cron taak ruimt sessiegegevens op die ouder is dan de ingestelde bewaartermijn. Paginatotalen worden nooit verwijderd. Bots worden herkend en genegeerd op basis van de User-Agent.

Aangepaste gebeurtenissen

Naast paginaweergaven meet MilkStats ook events, zonder dat daar configuratie voor nodig is:

  • Uitgaande links — een klik op een link naar een ander domein wordt automatisch geregistreerd, met het domein als label.
  • Downloads — een klik op een link naar een bestand met een bekende download-extensie (pdf, zip, docx, xlsx, en meer) wordt automatisch geregistreerd, met de bestandsnaam als label.
  • Handmatige gebeurtenissen — voeg het data-milkstats-event="label"-attribuut toe aan een
    link, knop of <form> om die klik of verzending als een aangepaste
    Gebeurtenis te volgen, bijvoorbeeld:
    Een offerte aanvragen
    of <form data-milkstats-event="Contact form submitted">…</form>.

Gebeurtenissen tellen mee als de bezoeker niet is uitgesloten (zie Instellingen) en worden op de statistiekenpagina getoond onder “Gebeurtenissen”, met de top labels per type.

Jezelf uitsluiten (opt-out)

Naast de roluitsluiting (werkt alleen terwijl je bent ingelogd) kun je jezelf — of een externe tester — ook uitsluiten zonder in te loggen:

  • Via the admin bar — administrators see a MilkStats item at the top
    (“tracking on”/”tracking off”) to flip this with one click.
  • Via een link — bezoek ?milkstats_optout=1 om jezelf uit te sluiten, of
    ?milkstats_optout=0 om weer meegeteld te worden. Werkt ook terwijl je bent uitgelogd, handig om te delen met externe testers.
  • Via de instellingenpagina — een knop (“Sluit mijn bezoeken in deze browser uit”) die de huidige status toont.

This sets a first-party cookie (milkstats_optout) in that one browser. The
cookie itself has no tracking purpose — purely a toggle — and works alongside
the role exclusion, not instead of it.

Instellingen

Onder Site Analytics Instellingen kun je configureren:

  • Uitgesloten rollen — welke gebruikersrollen nooit worden meegeteld (standaard: beheerder, redacteur, auteur, medewerker)
  • Jezelf uitsluiten — een knop om je eigen bezoeken in de huidige browser uit te sluiten, ook terwijl je bent uitgelogd (zie “Jezelf uitsluiten” hierboven)
  • Ledensegment — optioneel: welke rol(len) apart geteld moeten worden als een “ingelogd segment” (bv. leden, klanten, abonnees), met een eigen naam voor dat segment in de statistieken. Er kunnen tot drie extra benoemde segmenten worden geconfigureerd, elk te kiezen via een dropdown op de statistiekenpagina.
  • Bewaartermijn — na hoeveel dagen sessiedata (tijd op pagina, navigatiepaden, bronnen) automatisch wordt verwijderd

Waar zie ik de statistieken?

  • Een compact overzicht op het WordPress dashboard (widget)
  • A full statistics page under Site Analytics in the main menu, with a
    rolling period filter (7/30/90/365 days) plus a calendar period picker
    (today/yesterday, this/last week, this/last month, this/last quarter,
    this/last year), bar chart, top pages, navigation paths, source breakdown,
    device/browser/OS breakdown, and AI crawler visibility

Credits

De adminschermen gebruiken het lettertype Inter van Rasmus Andersson, meegeleverd met de plugin onder de SIL Open Font License 1.1 (assets/fonts/OFL.txt). Het wordt vanaf je eigen site geserveerd — nooit vanaf een externe font-CDN.

Schermafbeeldingen

Installatie

  1. Upload de map milkstats naar /wp-content/plugins/.
  2. Activeer de plugin via Plugins in WordPress.
  3. Ga naar Site Analytics Instellingen om rollen, segment en bewaartermijn naar wens in te stellen — de standaardinstellingen werken ook prima zonder aanpassingen.
  4. Bekijk je statistieken onder Site Analytics in het hoofdmenu.

FAQ

Is this plugin GDPR-compliant without a cookie banner?

Yes. No tracking cookies are placed, no IP addresses are stored, and no data
is shared with third parties. The session ID is generated in the browser
itself, lives only in sessionStorage (not persistent), and cannot be traced
back to an individual. The only cookie the plugin ever sets is the optional
opt-out cookie, and only if you or a visitor chooses to set it — that cookie
serves no tracking purpose.

Worden beheerders/redacteuren meegeteld?

Standaard niet — beheerder, redacteur, auteur en medewerker zijn uitgesloten. Dit is aan te passen onder Instellingen.

Kan ik mezelf uitsluiten, ook terwijl ik ben uitgelogd?

Yes. Besides the role exclusion (logged in only), you can exclude yourself
via the admin bar, the settings page, or the ?milkstats_optout=1 link in
the browser you’re currently using — handy for testing while logged out or
to share with an external tester. See “Excluding yourself (opt-out)” above.

Werkt dit met cachingplugins?

For regular visitor statistics, yes: that tracking runs via a separate AJAX
request after the page loads, so a cached page is still counted correctly.
The AI crawler report is an exception: that runs server-side (WordPress must
actually run to see a visit), so visits from AI crawlers to fully cached
pages (e.g. a “supercached” page with WP Super Cache) are missed in that
report.

Wat gebeurt er met mijn gegevens als ik MilkStats deactiveer of verwijder?

Deactivating the plugin (from the Plugins screen) leaves all data untouched
— your tables and settings are still there if you reactivate later.
Deleting the plugin (via “Delete” on the Plugins screen, which runs its
uninstall.php) permanently removes every MilkStats database table (page
views, sessions, session events, device stats, custom events, AI crawler
hits) and every MilkStats setting. This cannot be undone, so export any data
you want to keep (see the Export dashboard (.html)/CSV buttons on the
statistics page) before deleting the plugin.

Kan ik dit op meerdere sites gebruiken?

Ja, de plugin is bewust generiek gehouden: elke site-specifieke keuze (rollen, segment, bewaartermijn) is instelbaar, niet hardcoded.

Beoordelingen

Er zijn geen beoordelingen voor deze plugin.

Bijdragers & ontwikkelaars

“MilkStats” is open source software. De volgende personen hebben bijgedragen aan deze plugin.

Bijdragers

“MilkStats” is vertaald in 1 locale. Dank voor de vertalers voor hun bijdragen.

Vertaal “MilkStats” in je eigen taal.

Interesse in ontwikkeling?

Bekijk de code, haal de SVN repository op, of abonneer je op het ontwikkellog via RSS.

Changelog

1.8.1

  • Fixed the MilkStats icon missing from the hero banner on the Site Analytics
    and Settings pages on sites installed from WordPress.org. The 1.8.0
    package didn’t include assets/icon-128x128.png — it was mistakenly
    treated as a directory-listing-only asset even though the plugin’s own
    admin screens use it. No settings or data are affected; updating to 1.8.1
    is enough to restore the icon.

1.8.0

  • Existing installs of the older “Pion Analytics” plugin (and its interim
    “AVG Proof Site Analytics” release) are now upgraded to MilkStats
    automatically on activation, without losing any historical data. The
    existing page-view and session tables are renamed into place (never
    copied, so nothing is duplicated or left orphaned), the old Dutch
    visitor/member labels are converted to the format MilkStats uses, and the
    previous plugin’s scheduled cleanup task is removed. To switch over:
    deactivate the old plugin, install MilkStats, and activate it.
  • The admin menu item is now labelled “MilkStats” (was “Site Analytics”) and
    uses the MilkStats icon instead of a generic chart-bar icon.
  • Elke dashboardtegel heeft nu een klein ⓘ icoon rechtsboven — klik erop voor een korte uitleg van precies wat die tegel laat zien. Dezelfde iconen en uitleg zitten in het bestand “Exporteer dashboard (.html)”, voor de tegels die daarin voorkomen.
  • Nieuw menu-item “Help”, direct na “Instellingen”: een volledige uitleg van het dashboard plus een apart onderdeel over hoe MilkStats de privacy van bezoekers beschermt (wat wel en niet wordt opgeslagen, bewaartermijnen, uitgesloten rollen, en het opt-out-cookie).

1.7.0

  • Excel export has been removed entirely (the “Export Excel” button and the
    vendored PhpSpreadsheet library are both gone). A formula-driven Excel
    workbook turned out to be the wrong format for a shareable, interactive
    dashboard export — the new .html export below replaces it.
  • New “Export dashboard (.html)” button next to Export CSV: generates a
    single, self-contained .html file with the full Site Analytics dashboard
    (KPIs, the views-per-day chart, visitor sources, device/browser/OS
    breakdowns, top pages, and the AI crawler report) for all 14 period
    options at once. It needs no WordPress access or internet connection to
    view — just open the file in any browser — and switching between periods
    recalculates everything instantly with plain JavaScript, no page reload
    and no spreadsheet formulas involved.

1.6.0

  • Nieuwe kalender-periodekiezer op de statistiekenpagina, naast het bestaande rollende filter (7/30/90/365 dagen): vandaag/gisteren, deze/vorige week, deze/vorige maand, dit/vorig kwartaal, en dit/vorig jaar. Anders dan het rollende filter zijn deze kalender-uitgelijnd (bv. “vorige maand” is altijd de volledige vorige kalendermaand, niet de laatste 30 dagen).
  • Period-over-period comparison now also works for calendar periods. For a
    “this …” period still in progress (e.g. this month, part-way through),
    the comparison is capped to the same number of elapsed days in the
    previous period, so the percentage stays a fair, apples-to-apples
    comparison rather than always favoring the completed period.
  • De CSV-export weerspiegelt nu de actieve periodekeuze (rollend of kalender), inclusief de bestandsnaam.

1.5.0

  • Nieuw AI-crawlerzichtbaarheidsrapport: zie hoe vaak bekende AI-crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot, en andere) je site bezoeken, apart van menselijk verkeer — met een top-pagina’s-verdeling per crawler. Server-side gedetecteerd, omdat crawlers de JavaScript volger niet uitvoeren.
  • Bekende beperking: full-page caching kan crawlerbezoeken verbergen voor dit rapport (gedocumenteerd op de statistiekenpagina en in de FAQ hierboven).
  • Nieuwe “Export CSV”-knop op de statistiekenpagina: een lichte export van
    de tabel met de populairste pagina’s.
  • De statistiekenpagina kan nu wisselen tussen meerdere geconfigureerde segmenten via een dropdown naast de periodeselector, zonder een omweg via Instellingen. Er kunnen tot drie extra benoemde segmenten worden geconfigureerd onder Instellingen, naast het bestaande segment.

1.4.0

  • Self opt-out: exclude your own visits via an admin bar toggle, a settings
    page button, or a manual ?milkstats_optout=1 URL parameter — works even
    while logged out, alongside the existing role exclusion.
  • Privacy policy text and the WP Privacy Policy Guide integration updated to
    mention the new opt-out cookie (functional only, no tracking purpose).

1.3.0

  • Custom event tracking: outbound links and file downloads are detected
    automatically, plus a manual data-milkstats-event attribute for custom
    events (e.g. form submissions).
  • Nieuwe “Gebeurtenissen” kaart op de statistiekenpagina met top gebeurtenislabels per type.
  • Privacy policy text and the WP Privacy Policy Guide integration updated to
    mention the new events data.

1.2.0

  • Hernoemd van AVG/GDPR Proof Site Analytics naar MilkStats.
  • Full i18n: English source strings with a bundled Dutch translation.
  • Periode-over-periode-vergelijking op de statistiekkaarten voor paginaweergaven en sessies.
  • Landing- & exit-pagina’s-rapport.
  • AI-assistenten (ChatGPT, Perplexity, Gemini, Copilot, Claude.ai, enz.) als aparte verkeersbron-categorie.
  • Device, browser and OS breakdown, classified server-side — the raw
    User-Agent string is never stored.
  • Privacybeleid-integratie via wp_add_privacy_policy_content().
  • Visual redesign of the statistics page: a real line chart (this period vs.
    previous period), donut charts for traffic sources and device/browser/OS,
    and a refreshed MilkStats brand look.

1.1.0

  • Added source tracking: referrer category (search engine, social, referral,
    direct) and UTM campaign tags, with first-touch attribution per session.
  • Versiegebaseerde upgraderoutine zodat bestaande installaties automatisch de nieuwe tabel krijgen zonder herinstallatie.

1.0.0

  • Eerste release: paginaweergaven, sessies, tijd op pagina, navigatiepaden, instelbare rolfiltering en ledensegment, dashboardwidget en statistiekenpagina met periodefilter.