

Reader Progress report: plain-language milestone counts per content item, with a date-range filter, search, and CSV export.
Semantic Journey answers questions about your content that conventional analytics answers badly or not at all: what does this content experience look like for real readers, and did they reach the actions that matter to you? Not how many events fired, how long sessions lasted, or how you compare to a benchmark.
It is a plain-language, privacy-first alternative to conventional analytics for editorial teams, built around a fixed contract:
Semantic Journey works on any public post type, not only posts and pages: products, portfolio items, or any custom post type your site uses.
The reference implementation of the contract above. Reader Progress reports four fixed milestones for each piece of content:
Detection is content-relative, using IntersectionObserver against the primary content container, never scroll events, scroll percentages, time-on-page, or mouse movement. Milestones fire at most once per page view and are recorded as counts only: no per-event timestamps, no session or user identity of any kind.
A Decision Point marks the moment a reader reached a site-owner-defined action: a “Buy Now” button, a survey link, a phone number. Unlike Reader Progress’s four fixed milestones, Decision Point labels are yours to define, and a Decision Point can be reached more than once per page view since each click is a genuine, separate signal.
Four ways to mark a Decision Point, in order of precedence:
data-sj-decision="Label" attribute added to any element, for precise control from your theme or page builder.tel:), email links (mailto:), and text message links (sms:), all detected automatically with no configuration.Decision Point data appears as additional columns on the same Reports screen as Reader Progress, and in the same CSV export, built dynamically from whichever labels actually have data in the selected time window.
A dedicated Reports screen shows, for any content item, how many readers started, reached the middle, read most, or reached the end, over a 7/30/90-day window, plus a column for each Decision Point label with data in that window, with search, column sorting, and a CSV export. The four Reader Progress columns use plain-language milestone names and show counts only, no rates, percentages, or scores.
An At a Glance summary above the table shows the same five counts site-wide, each with a percentage: a share of Started Reading, computed from data already collected. This plugin does not track total pageviews or site visitors, and did not add that tracking to produce these percentages; Started Reading and Decision Point clicks intentionally have no percentage of their own, since neither is meaningfully a share of Started Reading. Below a configurable minimum sample (Settings > Reporting, default 30), only the count is shown, since a percentage computed from a handful of readers risks overstating what that small a sample actually shows.
The Reports screen can build a plain-text summary of exactly what is currently displayed (the full filtered set, not just the current page) for you to paste into an LLM of your choice, if you want a plain-English interpretation of the counts. This plugin does not send this text anywhere itself, there is no outbound link and no third-party integration; it copies to your clipboard only, and where you paste it afterward is entirely your own choice. The built-in instructions ask the LLM not to invent rates or percentages and not to assert a definite cause for any pattern, matching this plugin’s own approach to the same data.
A small sidebar box on the post/page edit screen (and any other trackable post type) confirms whether Reader Progress and Decision Point are recording for that piece of content, showing 30-day counts for each, with a link straight to the filtered Reports screen. Read-only, no fields to fill in.
A Semantic Journey column on the Posts/Pages list table (and any other trackable post type) gives an at-a-glance summary without opening each item. A Dashboard widget shows the same five At a Glance counts as Reports, over the last 7 days, plus the top 3 pieces of content by readers reaching the end.
This plugin does not send any data to third-party services. All data collected by Reader Progress stays in your own WordPress database, in a dedicated table, as aggregate daily counts. Nothing is shared externally, and no cookies or personal identifiers are used at any point.
Other plugins can integrate with Semantic Journey through a small, stable public API (see includes/functions.php):
semantic_journey_is_module_enabled( string $module, $context = null ): boolsemantic_journey_reader_progress_get_summary( int $content_id, int $days = 30 ): arraysemantic_journey_decision_point_get_summary( int $content_id, int $days = 30 ): arraysemantic_journey_module_enabled filter, for applying your own licensing or per-post rules on top of the site-level toggle.semantic_journey_module_data_recorded action, fired after every successful Reader Progress and Decision Point write with the module slug, content ID, date, and that day’s full current row.semantic_journey_reports_screen_tabs action, fired once on the Reports screen with the currently selected date window (start date, end date), for rendering an additional tab.Semantic Journey itself has no concept of licensing, plans, or host-specific gating; that interpretation belongs entirely to the integrating plugin.