pulse.md

Pulse Analytics
Why I built it
Almost every WordPress site gets Google Analytics slapped on by default. That means a cookie banner, a data processing agreement with an advertising company and visitor data that leaves your server before you've seen the first chart. For a practice like YLVA, where calm and respect are the starting point, that feels wrong; and legally it's not quite right either.
I wanted to know how many people stop by, where they come from and which pages work, without tracking anyone. That product didn't exist in the form I was looking for, so I built it myself.
The solution
Pulse is an analytics plugin that runs entirely inside WordPress:
- Cookieless: no cookie banner needed; no cookies are set and no personal data is stored.
- No external trackers: all data stays in your own database; nothing goes to Google or any other platform.
- Privacy by design: no device fingerprinting. Visitors are anonymized through a hashed identifier with a rotating salt; you can tell sessions apart, but you can't trace anyone.
- Reports in the WordPress admin: visitors over time, top pages, sources and devices, page journeys (Sankey) and button clicks, with date filters and a dashboard widget.
For the visitor it's invisible; for the owner it's just a tab in the menu.
Under the hood
Pulse is a tightly layered plugin (PHP 8.4, PSR-4, more than 40 test classes with PHPUnit):
- A light ingestion endpoint validates and normalizes every event before it goes into the database; classification of user agents and origin happens server-side.
- The privacy layer (salt store, visitor hasher, exclusion policy) is a separate, testable component on purpose: anonymization isn't an afterthought here, it's the core.
- A set of presenters turns the raw events into the numbers behind each chart (bounce, session duration, busiest hours, traffic sources, journeys), cleanly separated from the display.
- Maintenance runs on WP-cron: an aggregate roller condenses old events and a retention policy cleans up, so the tables don't grow forever.
No heavy JavaScript bundle on the front end, just a compact measurement script. The weight sits in the back end, where it belongs.
Status
In production with WordPress clients of basdekort.nl and set up as a reusable plugin. Actively maintained (v1.3.0): privacy-friendly statistics that you simply switch on and then forget about.




legal.json
"company_name": "Bas de Kort",
"legal_form": "sole proprietorship",
"trade_names": ["Bas de Kort", "LengthOfRope"],
"address": "Kerkeakker 3, 6674 EM Herveld, NL",
"chamber_of_commerce": "42038027",
"vat_id": "NL004476145B32",
"contact": { "form": "basdekort.nl/en/contact", "telephone": "+31628456862" },
"documents": [ "privacy", "terms and conditions", "data processing agreement" ]
}