pulse.md

Pulse Analytics

Pulse Analytics

Year
2026
Role
Creator & Lead Developer
Client
Own product
Categories
Stack
  • PHP 8.4
  • WordPress
  • MySQL
  • JavaScript
  • PHPUnit

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.