{"id":274019,"date":"2026-04-05T18:51:59","date_gmt":"2026-04-05T18:51:59","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/quantely\/"},"modified":"2026-04-06T20:23:51","modified_gmt":"2026-04-06T20:23:51","slug":"quantely-activity","status":"publish","type":"plugin","link":"https:\/\/en-nz.wordpress.org\/plugins\/quantely-activity\/","author":23434912,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.1.0","stable_tag":"1.1.0","tested":"6.9.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Quantely Activity","header_author":"Erravi","header_description":"Records pageviews and interaction events on your WordPress site.","assets_banners_color":"ffffff","last_updated":"2026-04-06 20:23:51","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.erravi.com\/plugins\/quantely-activity\/","header_author_uri":"https:\/\/www.erravi.com\/","rating":5,"author_block_rating":0,"active_installs":0,"downloads":73,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.4":{"tag":"1.0.4","author":"erravi","date":"2026-04-05 18:51:40"},"1.1.0":{"tag":"1.1.0","author":"erravi","date":"2026-04-06 20:23:51"}},"upgrade_notice":{"1.1.0":"<ul>\n<li>quant_visit now uses a 35-day lifetime with sliding expiration.<\/li>\n<li>visitor_key remains a coarse cookie-less fallback, without monthly rotation.<\/li>\n<li>The readme has been refreshed to better describe visitor activity capture and traffic monitoring.<\/li>\n<\/ul>","1.0.4":"<p>Maintenance update with review hardening and admin-side improvements.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.gif":{"filename":"icon-128x128.gif","revision":3499301,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.gif":{"filename":"icon-256x256.gif","revision":3499301,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3499301,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.4","1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3499301,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3499301,"resolution":"2","location":"assets","locale":""},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3499301,"resolution":"3","location":"assets","locale":""},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3499301,"resolution":"4","location":"assets","locale":""},"screenshot-5.jpg":{"filename":"screenshot-5.jpg","revision":3499301,"resolution":"5","location":"assets","locale":""}},"screenshots":{"1":"Live activity stream","2":"Simple counters","3":"Settings and privacy controls","4":"Exclusions and bot handling"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[7175,259579,2497,259578,31634],"plugin_category":[40,54],"plugin_contributors":[259476],"plugin_business_model":[],"class_list":["post-274019","plugin","type-plugin","status-publish","hentry","plugin_tags-pageviews","plugin_tags-traffic-monitor","plugin_tags-visitor-tracking","plugin_tags-website-activity","plugin_tags-website-traffic","plugin_category-calendar-and-events","plugin_category-security-and-spam-protection","plugin_contributors-erravi","plugin_committers-erravi"],"banners":{"banner":"https:\/\/ps.w.org\/quantely-activity\/assets\/banner-772x250.jpg?rev=3499301","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/quantely-activity\/assets\/icon-128x128.gif?rev=3499301","icon_2x":"https:\/\/ps.w.org\/quantely-activity\/assets\/icon-256x256.gif?rev=3499301","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/quantely-activity\/assets\/screenshot-1.jpg?rev=3499301","caption":"Live activity stream"},{"src":"https:\/\/ps.w.org\/quantely-activity\/assets\/screenshot-2.png?rev=3499301","caption":"Simple counters"},{"src":"https:\/\/ps.w.org\/quantely-activity\/assets\/screenshot-3.jpg?rev=3499301","caption":"Settings and privacy controls"},{"src":"https:\/\/ps.w.org\/quantely-activity\/assets\/screenshot-4.jpg?rev=3499301","caption":"Exclusions and bot handling"},{"src":"https:\/\/ps.w.org\/quantely-activity\/assets\/screenshot-5.jpg?rev=3499301","caption":""}],"raw_content":"<!--section=description-->\n<p>Quantely Activity is a lightweight capture layer that records pageviews and events. It helps site owners understand how visitors use their website.<\/p>\n\n<p>Quantely Activity is designed to record activity on your site in a structured and reliable way, with a strong focus on signal capture and data integrity. Whether JavaScript is blocked, networks are unreliable, redirects interfere, or traffic includes bots, scanners, and logged-in admins, it is built to capture activity reliably under imperfect conditions.<\/p>\n\n<p>Quantely Activity does not focus on marketing analytics, attribution modelling, or behavioral profiling. Instead, it focuses on capturing reliable activity data that can also feed downstream analytics tools.<\/p>\n\n<p>Quantely Activity is turn-key: install it, and pageviews and events should begin appearing shortly after.<\/p>\n\n<p>Raw activity data is stored only briefly, helping keep the plugin lightweight and privacy-conscious.<\/p>\n\n<h3>Key features<\/h3>\n\n<h4>1. Reliable capture<\/h4>\n\n<p>Quantely Activity prioritizes a dependable capture baseline before adding richer signals.<\/p>\n\n<p>Server-side pageview capture (always-on baseline)<br \/>\nPageviews are recorded server-side, helping ensure capture even when JavaScript is blocked, networks are unreliable, or browser scripts fail.<\/p>\n\n<p>Optional browser beacon collector (enhanced signals)<br \/>\nA lightweight browser collector can send additional signals such as clicks, form submissions, and engagement pings.<\/p>\n\n<p>Server-browser alignment<br \/>\nServer and browser signals are aligned using a per-page-load <code>pv_id<\/code>. This allows pings and browser events to be associated with the correct pageview, even when browser signals arrive later than the server-side pageview.<\/p>\n\n<p>Receive-order recording<br \/>\nHits are stored in the order they are received. Browser events may therefore appear after their related pageview when beacons arrive later. Origin metadata is preserved so downstream analytics tools can reconstruct the correct behavioral sequence.<\/p>\n\n<h4>2. Event origin metadata<\/h4>\n\n<p>Quantely Activity preserves origin metadata so downstream analytics tools can reconstruct user behavior more accurately.<\/p>\n\n<p>Events may arrive later than their related pageviews, for example when browser beacons arrive after server-side pageviews. Origin metadata allows analytics tools to assign events to the page where they occurred.<\/p>\n\n<p>Origin fields include:<\/p>\n\n<ul>\n<li><code>origin_pv_id<\/code> \u2014 identifier of the pageview where the event originated<\/li>\n<li><code>origin_path<\/code> \u2014 path of the origin pageview<\/li>\n<li><code>origin_page_seq<\/code> \u2014 page sequence number within the visit<\/li>\n<li><code>client_ts_ms<\/code> \u2014 client-side event timestamp, when available<\/li>\n<\/ul>\n\n<p>These fields support behavioral reconstruction independently of hit arrival order.<\/p>\n\n<h4>3. Signal deduplication<\/h4>\n\n<p>Browser signals may occasionally be sent more than once due to retries, network issues, or repeated interactions.<\/p>\n\n<p>Quantely Activity applies lightweight deduplication to reduce duplicate signals.<\/p>\n\n<p>Events may be merged within a short time window while preserving diagnostic metadata. Pageviews are handled more conservatively. Duplicate pageviews may be suppressed when clearly redundant, but they are not merged because pageviews form the structural backbone of the activity stream.<\/p>\n\n<h4>4. Engagement signals<\/h4>\n\n<p>Instead of running continuous timers or larger client scripts, Quantely Activity records engagement as compact milestone signals.<\/p>\n\n<p>Engagement pings are recorded as a single maximum engagement value per pageview.<\/p>\n\n<p>Milestones follow the Fibonacci sequence: <code>2s \/ 3s \/ 5s \/ 8s \/ 13s \/ 21s \/ 34s \/ 55s \/ 89s<\/code>.<\/p>\n\n<p>This provides finer resolution for short visits and progressively coarser resolution for longer engagement, while keeping storage lightweight.<\/p>\n\n<h4>5. Traffic context<\/h4>\n\n<p>Quantely Activity records the context needed to interpret traffic more reliably.<\/p>\n\n<p>UTM capture:\n- <code>utm_source<\/code>\n- <code>utm_medium<\/code>\n- <code>utm_campaign<\/code>\n- <code>utm_term<\/code>\n- <code>utm_content<\/code><\/p>\n\n<p>Click ID capture:<br \/>\nCommon identifiers such as <code>gclid<\/code>, <code>fbclid<\/code>, and others can be stored, including multiple identifiers in a compact field.<\/p>\n\n<p>Channel derivation:<br \/>\nTraffic can be classified at capture time based on referrer, UTMs, and click IDs.<\/p>\n\n<p>Channels include:\n- email\n- paid\n- social\n- ai\n- search\n- referral\n- direct\n- internal<\/p>\n\n<p>Channels can optionally be overridden by custom campaign rules using referrer host and UTM parameters.<\/p>\n\n<h4>6. WooCommerce purchase capture<\/h4>\n\n<p>Quantely Activity can capture WooCommerce purchases as lightweight conversion events.<\/p>\n\n<p>A purchase event is recorded around checkout\/order creation, helping ensure reliable capture across different WooCommerce flows and payment timings.<\/p>\n\n<p>Captured fields include:\n- <code>event_name<\/code>: <code>purchase<\/code>\n- <code>integration<\/code>: <code>woocommerce<\/code>\n- <code>order_id<\/code>\n- <code>purchase_origin<\/code><\/p>\n\n<p>Product details and order totals are intentionally not stored. The purchase event acts as a minimal conversion marker for downstream analytics tools.<\/p>\n\n<h4>7. Bot detection and reclassification<\/h4>\n\n<p>Quantely Activity detects suspicious or automated traffic and records structured classifications at capture time.<\/p>\n\n<p>Stored indicators include:\n- <code>is_nonhuman<\/code>\n- <code>bot_label<\/code>\n- <code>bot_reason<\/code><\/p>\n\n<p>Classification uses lightweight heuristics such as user-agent patterns, technical endpoint access, and burst patterns typical for scanners or link prefetchers.<\/p>\n\n<p>Internal actor state helps track repeated behavior over time. This allows pattern-based reclassification. For example, probing or scanning behavior observed later can update earlier hits from the same actor.<\/p>\n\n<p>Non-human traffic remains visible in Activity for diagnostics, but can be excluded from analytics processing.<\/p>\n\n<h4>8. Exclusions that do not destroy evidence<\/h4>\n\n<p>Most analytics tools silently drop excluded traffic. Quantely Activity does not.<\/p>\n\n<p>Excluded hits remain visible in Activity but are clearly marked. This preserves diagnostic and forensic visibility while allowing analytics tools to filter the traffic when needed.<\/p>\n\n<p>Supported exclusions include:\n- role-based exclusions\n- IP-based exclusions\n- path-based exclusions<\/p>\n\n<p>Stored fields include:\n- <code>is_excluded<\/code>\n- <code>exclude_reason<\/code><\/p>\n\n<p>This helps ensure excluded traffic does not distort analytics while still allowing site owners to inspect what happened.<\/p>\n\n<h4>9. Short-term capture layer<\/h4>\n\n<p>Quantely Activity is designed as a short-term capture layer rather than a long-term analytics store.<\/p>\n\n<p>Raw activity data is retained only for a limited period to keep the system lightweight and privacy-conscious.<\/p>\n\n<p>All captured activity is stored in your own WordPress database.<\/p>\n\n<h4>10. Privacy<\/h4>\n\n<p>Quantely Activity is designed for reliable measurement while minimizing long-term storage and personal data exposure.<\/p>\n\n<ul>\n<li>No plain IP addresses stored<\/li>\n<li>Short configurable retention window<\/li>\n<li>Optional honoring of GPC \/ DNT signals<\/li>\n<li>No external tracking services<\/li>\n<li>Data remains on your own site<\/li>\n<\/ul>\n\n<p>This gives site owners visibility into activity while keeping capture local and controlled.<\/p>\n\n<h3>Hooks<\/h3>\n\n<p>Quantely Activity exposes a small developer API for integrations and downstream processing.<\/p>\n\n<ul>\n<li><code>qmon_hit_before_insert<\/code> \u2014 Filter a normalized hit array before it is stored.<\/li>\n<li><code>qmon_hit_recorded<\/code> \u2014 Action fired after a hit has been stored. This is the main integration point for forwarding or persisting captured records.<\/li>\n<li><code>qmon_event_normalize<\/code> \u2014 Filter a normalized event payload before it is finalized.<\/li>\n<li><code>qmon_event_db_dedupe_window_sec<\/code> \u2014 Filter the database deduplication window for events.<\/li>\n<li><code>qmon_bot_verdict<\/code> \u2014 Filter the bot-classification verdict before it is finalized.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin ZIP via <strong>WordPress Admin \u2192 Plugins \u2192 Add New \u2192 Upload Plugin<\/strong><\/li>\n<li>Activate the plugin<\/li>\n<li>Open <strong>Quantely \u2192 Activity<\/strong> to confirm that hits are being recorded<\/li>\n<li>Adjust settings if needed<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20does%20quantely%20activity%20record%3F\"><h3>What does Quantely Activity record?<\/h3><\/dt>\n<dd><p>It records pageviews and interaction events as individual hits.<\/p><\/dd>\n<dt id=\"does%20it%20replace%20analytics%20tools%3F\"><h3>Does it replace analytics tools?<\/h3><\/dt>\n<dd><p>No. Quantely Activity is a capture and monitoring layer. It is not a marketing analytics suite and does not aim to replace long-term analytics reporting.<\/p><\/dd>\n<dt id=\"is%20javascript%20required%3F\"><h3>Is JavaScript required?<\/h3><\/dt>\n<dd><p>No. Server-side capture records pageviews without JavaScript. Browser-side JavaScript extends capture with interaction events and engagement pings.<\/p><\/dd>\n<dt id=\"how%20long%20is%20data%20stored%3F\"><h3>How long is data stored?<\/h3><\/dt>\n<dd><p>Raw hits are stored only for a short configurable period, typically between 6 and 48 hours. The plugin is intended for monitoring and diagnostics rather than long-term data warehousing.<\/p><\/dd>\n<dt id=\"does%20it%20store%20ip%20addresses%3F\"><h3>Does it store IP addresses?<\/h3><\/dt>\n<dd><p>No. Plain IP addresses are not stored. The plugin uses derived or hashed values where needed for classification and exclusion logic.<\/p><\/dd>\n<dt id=\"does%20it%20send%20data%20to%20external%20services%3F\"><h3>Does it send data to external services?<\/h3><\/dt>\n<dd><p>No. Captured activity is stored locally in the WordPress database.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>quant_visit now uses a 35-day lifetime with sliding expiration.<\/li>\n<li>visitor_key remains a coarse cookie-less fallback, without monthly rotation.<\/li>\n<li>Updated the plugin readme with clearer positioning, new tags, and revised feature descriptions.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Review hardening for WordPress.org submission<\/li>\n<li>Improved sanitization, validation, escaping, and internationalization coverage<\/li>\n<li>Improved REST input sanitization and related code quality refinements<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Improved event correlation and deduplication behavior<\/li>\n<li>Expanded diagnostics and integration-related improvements<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Refinements to monitoring, exclusions, and settings behavior<\/li>\n<li>Stability and compatibility improvements<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Minor fixes and internal improvements<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial version prepared during pre-release review.<\/li>\n<\/ul>","raw_excerpt":"See what is really happening on your WordPress website.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/en-nz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/274019","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/en-nz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/en-nz.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/en-nz.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=274019"}],"author":[{"embeddable":true,"href":"https:\/\/en-nz.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/erravi"}],"wp:attachment":[{"href":"https:\/\/en-nz.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=274019"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/en-nz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=274019"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/en-nz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=274019"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/en-nz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=274019"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/en-nz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=274019"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/en-nz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=274019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}