Title: SQMViews
Author: Pavel Khloponin
Published: <strong>1, Febreru de 2026</strong>
Last modified: 17, Marzu de 2026

---

Guetar plugins

![](https://s.w.org/plugins/geopattern-icon/sqm-views.svg)

# SQMViews

 By [Pavel Khloponin](https://profiles.wordpress.org/schqm/)

[Download](https://downloads.wordpress.org/plugin/sqm-views.1.2.4.zip)

 * [Details](https://ast.wordpress.org/plugins/sqm-views/#description)
 * [Reviews](https://ast.wordpress.org/plugins/sqm-views/#reviews)
 *  [Installation](https://ast.wordpress.org/plugins/sqm-views/#installation)
 * [Development](https://ast.wordpress.org/plugins/sqm-views/#developers)

 [Support](https://wordpress.org/support/plugin/sqm-views/)

## Description

**SQMViews** is a simple and lightweight tracking and analytics plugin that helps
you understand how visitors interact with your WordPress content—without sending
data to third-party services.
 Plugin adds very little overhead, capable of tracking
millions of page views per day on a moderately sized website. Plugin includes sqm-
views-pages.php drop-in script installation (Fast endpoint) to collect pageviews
without loading WordPress core, reducing pageview request from 250 ms to 5 ms. If
drop-in installation is not possible, the plugin falls back to the WordPress call(
API endpoint).

#### Key Features

**Tracking & Analytics:**

 * Near real-time page view tracking
 * Engagement metrics (time on page, active time)
 * Shows user activity (clicks, scrolls, etc.) with privacy-friendly event counting
 * Interactive analytics dashboard with D3.js visualizations
 * Historical data with daily aggregation
 * Filter by date range, content type, and more

**Performance:**

 * Ultra-fast tracking endpoint (bypasses a core load)
 * Minimal overhead (~5ms per request with the drop-in script)
 * File-based batch processing (no database requests during the pageview event collection,
   only during cron processing)
 * Efficient data storage with automatic archiving
 * Configurable background processing via WP-Cron

**Drop-in script**
 * Created to minimize overhead * Uses exactly the same code 
as the API endpoint except two hooks for config modification (sqm_views_ping_interval,
sqm_views_session_timeout) * Run strict JSON request schema validation to minimize
attack surface. * Receives request, run validation, add it to a file for the later
batch processing. Very low memory and CPU footprint.

**Pageview lifetime**
 JS code will send an `init` event, followed by `ping` events
and completed by `exit` or `timeout` events. Unique ID is returned during `init`
used for all the following events. During cron processing all the events with the
same IDs are combined into a single pageview and stored in the database.

**Privacy & Control:**

 * 100% privacy-focused (no external services)
 * All data stays on your server
 * Encrypted tracking payloads (you don’t need to reveal everything you track)
 * Full control over what gets tracked
 * GDPR-friendly (no personal data collected by default), we focus on pageviews

**Flexibility:**

 * Track custom post types and taxonomies
 * 30+ developer hooks for customization
 * WP-CLI commands for automation
 * Translation-ready (i18n)
 * REST API for integrations

#### What Gets Tracked?

**Content Types:**
 * Posts and pages (configurable) * Custom post types * Category
and tag archives * Custom taxonomy archives * Author archives * Date archives * 
Home page * Search results

**Engagement Metrics:**
 * **Count** – Total number of views * **Time on Page** –
Total time spent on page * **Active Time** – Time user was actively engaged * **
High-Frequency Events** – User browsing on the page (scrolling, mouse movement) ***
Low-Frequency Events** – Deliberate actions (clicks, touches, typing)

#### Perfect For

 * **Publishers** monitoring content performance
 * **Marketers** analyzing user engagement
 * **Developers** needing custom analytics
 * **Privacy-conscious** site owners
 * **Anyone** wanting Google Analytics alternative

#### How It Works

 1. **Lightweight JavaScript tracker** injected on tracked pages (inline or external)
 2. **Fast endpoint** receives tracking data
 3. **File-based storage for raw data** writes data to JSONL files (no database overhead)
 4. **Background processing** via WP-Cron aggregates data hourly/daily and put them
    in the database
 5. **Interactive dashboard** displays charts and metrics

#### Extensibility

**30+ Developer Hooks:**

 * **Frontend Hooks** – Control what gets tracked and how
 * **Processing Hooks** – Modify data before database storage
 * **REST API Hooks** – Customize chart data and permissions
 * **Activation Hooks** – Adjust default settings and storage

#### WP-CLI Support

    ```
    # Process statistics manually
    wp sqm-views process
    ```

#### Multisite Compatible

Planned

#### Why Choose SQMViews?

**vs. External Analytics:**
 * No external JavaScript libraries * No tracking cookies
required * No data sent to Google servers * Faster page loads (no external requests)*
Complete data ownership

#### Requirements

 * WordPress 6.0 or higher
 * PHP 8.1 or higher (PHP 8.2+ recommended)
 * PHP Sodium extension (for encryption)
 * MySQL 5.6 or higher / MariaDB 10.0 or higher
 * Write permissions for `wp-content/uploads/sqm-views` directory

#### Credits

SearchQueryMaster.com team

Powered by:
 * D3.js for visualizations * WordPress CMS * Sodium crypto library

### Privacy Policy

SQMViews is designed with privacy in mind. The plugin:

**Does NOT collect:**
 * Personal information * Cookies not required for tracking*
Sessions – there is no session tracking at the moment, only pageviews tracking *
Usernames or emails * Browser fingerprints

**IP address and user agents are:**
 * collected in raw log files for troubleshooting,
spam, bot, and system abuse prevention * removed from aggregated data and not used
anywhere else

**Does collect:**
 * Page URLs being viewed * Tags and categories on the current
page * Timestamps of visits * User interaction metrics (scrolls, clicks) counter*
Browser user-agent string (for bot filtering) * Referrer URL (if available)

**Data storage:**
 * All data stored on your WordPress server * No data sent to 
external services * You control data retention and deletion

**Your responsibilities:**
 * Update your site’s privacy policy to mention analytics
tracking * Implement cookie consent if required in your jurisdiction * Handle data
subject access requests per GDPR/CCPA requirements * Configure the plugin to exclude
personal data if necessary

### Support

**Free Support:**
 * [WordPress.org Support Forum](https://wordpress.org/support/plugin/sqm-views/)

### Developer Notes

**Architecture:**
 * Namespaced PHP code (`SQMViews\`) * PSR-4 autoloading via Composer*
REST API endpoints for integrations * File-based queueing system

**Database Tables:**
 * `sqm_views_trackables` – Catalog of tracked content * `sqm_views_events`–
Event type definitions * `sqm_views_records` – Individual tracking records * `sqm_views_daily`–
Daily aggregated statistics

**Hooks:**

**Hooks Reference:**

_Filters (apply\_filters):_

**Tracking & Frontend:**
 * `sqm_views_should_track` – Control whether tracking 
should occur (2 params: $should_track, $data) * `sqm_views_tracking_data` – Modify
tracking data before encryption (1 param: $tracking_data) * `sqm_views_trackable_post_types`–
Customize which post types can be tracked (1 param: $post_types) * `sqm_views_trackable_taxonomies`–
Customize which taxonomies can be tracked (1 param: $taxonomies) * `sqm_views_data_taxonomies`–
Modify taxonomies included in tracking data (1 param: $taxonomies) * `sqm_views_encryption_key`–
Override the encryption key (1 param: $key) * `sqm_views_tracker_endpoint` – Customize
tracking endpoint URL (2 params: $endpoint, $saved_endpoint) * `sqm_views_minified_js`–
Control whether to use minified tracker JS (1 param: $use_min) * `sqm_views_tracker_script_path`–
Customize the tracker script file path (2 params: $path, $use_min) * `sqm_views_tracker_script_url`–
Customize tracker script URL (2 params: $url, $use_min) * `sqm_views_inline_js` –
Control whether to inline tracker JS (1 param: $use_inline) * `sqm_views_show_debug_comment`–
Show debug HTML comment (1 param: $show)

**Processing:**
 * `sqm_views_raw_record` – Filter raw record data during processing(
1 param: $data) * `sqm_views_calculated_metrics` – Modify calculated metrics (2 
params: $metrics, $records) * `sqm_views_session_timeout` – Customize session inactivity
timeout (1 param: $timeout) * `sqm_views_ping_interval` – Customize the ping interval
for session tracking (1 param: $interval)

**Dashboard:**
 * `sqm_views_dashboard_minified_js` – Control minified JS for dashboard(
1 param: $use_min) * `sqm_views_dashboard_script_path` – Dashboard script file path(
2 params: $path, $use_min) * `sqm_views_dashboard_script_url` – Dashboard script
URL (2 params: $url, $use_min) * `sqm_views_dashboard_inline_js` – Control inline
JS for dashboard (1 param: $use_inline) * `sqm_views_dashboard_default_filters` –
Customize default dashboard filters (1 param: $defaults)

**REST API:**
 * `sqm_views_rest_permissions` – Customize REST API permissions (
1 param: $capability) * `sqm_views_rest_chart_data` – Modify chart data in REST 
response (2 params: $data, $request) * `sqm_views_chart_cache_expiration` – Customize
chart cache expiration time (1 param: $seconds) * `sqm_views_rest_chart_filters`–
Customize available chart filters (1 param: $filters)

**Activation & Settings:**
 * `sqm_views_enable_dropin` – Enable/disable drop-in
file creation (1 param: $enable) * `sqm_views_default_settings` – Customize default
plugin settings (1 param: $settings) * `sqm_views_data_directory` – Customize data
storage directory (1 param: $directory)

_Actions (do\_action):_

**Activation & Upgrade:**
 * `sqm_views_activated` – Fires after plugin activation(
0 params) * `sqm_views_upgraded` – Fires after plugin upgrade (2 params: $from_version,
$to_version) * `sqm_views_before_upgrade` – Fires before the upgrade process (2 
params: $from_version, $to_version) * `sqm_views_after_upgrade` – Fires after the
upgrade process (2 params: $from_version, $to_version) * `sqm_views_uninstalled`–
Fires during plugin uninstallation (0 params)

**Tracking:**
 * `sqm_views_before_tracker_output` – Before tracker script output(
2 params: $tracking_data, $tracker_config) * `sqm_views_after_tracker_output` – 
After tracker script output (1 param: $tracking_data)

**Processing:**
 * `sqm_views_before_processing` – Before statistics processing 
starts (1 param: $verbose) * `sqm_views_after_processing` – After statistics processing
completes (1 param: $processor_instance) * `sqm_views_record_processed` – After 
individual record processed (1 param: $record) * `sqm_views_daily_aggregated` – 
After daily aggregation completes (1 param: $result)

**Cache:**
 * `sqm_views_chart_cache_invalidated` – When chart cache is cleared (
0 params)

**Examples**
 **Frontend Hooks – Control Tracking Behavior:**

Exclude logged-in administrators from tracking (will not work properly if you cache
pages or use CDN):

    ```
    add_filter( 'sqm_views_should_track', function( $should_track, $data ) {
        if ( current_user_can( 'manage_options' ) ) {
            return false;
        }
        return $should_track;
    }, 10, 2 );
    ```

Modify tracking data before sending:

    ```
    add_filter( 'sqm_views_tracking_data', function( $data ) {
        // Add custom metadata
        $data['custom_field'] = get_post_meta( get_the_ID(), 'my_field', true );
        return $data;
    } );
    ```

Customize which post types are tracked (overrides UI settings):

    ```
    add_filter( 'sqm_views_tracked_post_types', function( $post_types ) {
        // Add custom post type
        $post_types[] = 'portfolio';
        return $post_types;
    } );
    ```

**Processing Hooks – Modify Data Before Storage:**

Calculate custom engagement metrics:

    ```
    add_filter( 'sqm_views_calculated_metrics', function( $metrics, $records ) {
        // Calculate engagement score
        $metrics['engagement_score'] = ( $metrics['active'] / max( 1, $metrics['on_page'] ) ) * 100;

        // Calculate bounce rate indicator
        $metrics['likely_bounce'] = $metrics['on_page'] < 5 ? 1 : 0;

        return $metrics;
    }, 10, 2 );
    ```

Filter records before processing:

    ```
    add_filter( 'sqm_views_before_process_record', function( $record ) {
        // Exclude specific URLs
        if ( strpos( $record['url'], '/test-page/' ) !== false ) {
            return null; // Skip this record
        }
        return $record;
    } );
    ```

**REST API Hooks – Customize Chart Data:**

Modify chart permissions:

    ```
    add_filter( 'sqm_views_rest_permissions', function( $has_permission ) {
        // Allow editors to view analytics
        return current_user_can( 'edit_posts' );
    } );
    ```

**Activation Hooks – Adjust Default Settings:**

Set custom default settings on activation:

    ```
    add_action( 'sqm_views_activated', function() {
        // Set default processing interval
        update_option( 'sqm_views_cron_interval', 'hourly' );

        // Enable external JavaScript by default
        update_option( 'sqm_views_js_mode', 'external' );
    } );
    ```

**Cron Hooks – Custom Processing Schedules:**

Run custom tasks after processing:

    ```
    add_action( 'sqm_views_after_process', function( $processed_count ) {
        // Send notification if processing high volume
        if ( $processed_count > 10000 ) {
            wp_mail(
                get_option( 'admin_email' ),
                'SQMViews High Volume Alert',
                sprintf( 'Processed %d records', $processed_count )
            );
        }
    }, 10, 1 );
    ```

**REST API:**
 * `POST /wp-json/sqm-views/v1/track` – Submit tracking data through
WordPress API endpoint * `POST sqm-views-pages.php` – Submit tracking data through
Fast endpoint * `GET /wp-json/sqm-views/v1/charts` – Retrieve chart data

**WP-CLI:**
 * `wp sqm-views process` – Process pending statistics

**License:**

GPLv3. See LICENSE file for details.

## Screenshots

 * [[
 * Interactive analytics dashboard with D3.js visualizations showing page view trends,
   engagement metrics, and filtering options
 * [[
 * Tracking settings page for configuring which post types and taxonomies to track
 * [[
 * Processing settings page showing cron status, scheduled runs, and manual processing
   options
 * [[
 * Statistics overview displaying total records, recent activity, and active endpoint
   configuration

## Installation

#### Automatic Installation

 1. Log in to your WordPress admin panel
 2. Navigate to **Plugins  Add New**
 3. Search for “SQMViews”
 4. Click **Install Now** then **Activate**
 5. Go to **SQMViews  Tracking Settings** to configure

#### Manual Installation

 1. Download the plugin zip file
 2. Log in to your WordPress admin panel
 3. Navigate to **Plugins  Add New  Upload Plugin**
 4. Choose the zip file and click **Install Now**
 5. Click **Activate Plugin**
 6. Go to **SQMViews  Tracking Settings** to configure

#### First Steps After Installation

 1. **Configure Tracking** – Go to **SQMViews  Tracking Settings**
 2.  * Select which post types to track
     * Choose taxonomy archives to monitor
     * Select a JavaScript loading method (inline/external)
 3. **Set Processing Schedule** – Go to **SQMViews  Processing**
 4.  * Choose a cron interval (hourly recommended)
     * Verify endpoint status (fast endpoint preferred)
 5. **View Analytics** (Once you have enough data) – Go to **SQMViews  Statistics**
 6.  * Explore interactive dashboard
     * Filter by date range
     * Compare different metrics

#### Performance Optimization

For best performance on high-traffic sites:

 1. **Enable Fast Endpoint** (automatic on most hosts)
 2.  * Copy sqm-views-pages.php in the WordPress root folder (next to wp-config.php)
     * Bypasses WordPress load
     * Reduces tracking overhead from ~250ms to ~5ms
     * Check status in **Processing Settings**
 3. **Use External JavaScript** (recommended for caching)
 4.  * Set in **Tracking Settings**
     * Allows browser caching
     * Slightly faster page loads
 5. **Adjust Cron Interval**
 6.  * Hourly: Good for most sites
     * 15 minutes: High-traffic sites needing real-time data
     * 6 hours/Daily: Low-traffic sites saving resources

## FAQ

### Does this plugin send data to external servers?

**No!** All data stays on your server. No data is sent to any third-party tracking
services. You have complete control and ownership of your analytics data.

### Will this slow down my website?

**No!** The plugin is optimized for performance:

 * **Fast tracking endpoint** bypasses WordPress load (~5ms response time).
 * Conventional **API endpoint** uses WordPress REST API (~250ms response time).
 * **Asynchronous JavaScript** doesn’t block page rendering.
 * **File-based storage** during tracking (zero database write regarding of your
   traffic).
 * **Background processing** via WP-Cron through batch writes into a separate table(
   minimal impact on the database performance and visitors).

Most sites should see no noticeable performance impact.

### Is it GDPR compliant?

The plugin is **GDPR-friendly** by default:

 * No personal data collected (IP present in the raw log files to prevent abuse 
   and removed from aggregated data, no cookies)
 * No data sent to external services
 * All data stored on your server
 * You control data retention policies

However, you’re responsible for:

 * Implementing proper consent mechanisms if required
 * Updating your privacy policy
 * Handling data subject access requests

### Can I track custom post types?

**Yes!** Go to **SQMViews  Tracking Settings** and select any registered post types.
The plugin automatically detects all public post types on your site, or use hook`
sqm_views_trackable_post_types`

### Does it work with caching plugins?

**Yes!** The JavaScript tracker should work seamlessly with most of the caching 
plugins and services including:

 * WP Super Cache
 * W3 Total Cache
 * WP Rocket
 * LiteSpeed Cache
 * Cloudflare
 * Cloudfront

The tracking code runs on the client-side, so cached pages are tracked properly.

### Can I exclude certain users from tracking?

**Yes!** Use the `sqm_views_should_track` filter hook:

    ```
    add_filter( 'sqm_views_should_track', function( $should_track, $data ) {
        // Exclude logged-in administrators
        if ( current_user_can( 'manage_options' ) ) {
            return false;
        }
        return $should_track;
    }, 10, 2 );
    ```

And adjust your CDN and caching plugins to exclude logged-in users from caching.

### How much disk space does it use?

Storage requirements depend on traffic (YMMV):

 * **Low traffic** (1,000 views/day): ~50 MB/month
 * **Medium traffic** (10,000 views/day): ~500 MB/month
 * **High traffic** (100,000 views/day): ~5 GB/month
 * TBD based on actual usage

Raw files are automatically archived into daily files and can be safely deleted 
after processing.
 We recommend storing archived files in a cold storage in case
you want to replay the processing and aggregation, to remove bot traffic or extend
data with more information.

### Can I import/export the data?

Planned functionality.

### What’s the difference between “active time” and “time on page”?

 * **Time on Page**: Total time from page load to exit (includes idle time)
 * **Active Time**: Time when user is actively engaging (scrolling, clicking, typing),
   checked every 10s.

Active time gives you better insight into actual engagement vs. just having a tab
open.

### Can I track non-WordPress pages?

It is possible, see the setup used to track Home page and Search results.

### Where is the data stored?

Analytics data is stored in two places:

 1. **Raw files**: `wp-content/uploads/sqm-views/raw/*.jsonl` (temporary)
 2. **Database**: Four WordPress database tables (`sqm_views*`)

Raw files are automatically processed and archived by WP-Cron.

### How do I uninstall the plugin?

**Deactivation** keeps all data intact.

**Deletion** removes all plugin files, database tables, and settings permanently.
Make sure to export any data you want to keep before deleting.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“SQMViews” is open source software. The following people have contributed to this
plugin.

Contributors

 *   [ Pavel Khloponin ](https://profiles.wordpress.org/schqm/)

[Translate “SQMViews” into your language.](https://translate.wordpress.org/projects/wp-plugins/sqm-views)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/sqm-views/), check 
out the [SVN repository](https://plugins.svn.wordpress.org/sqm-views/), or subscribe
to the [development log](https://plugins.trac.wordpress.org/log/sqm-views/) by [RSS](https://plugins.trac.wordpress.org/log/sqm-views/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

See separate file CHANGELOG.md

## Meta

 *  Version **1.2.4**
 *  Last updated **4 selmanes ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.2 or higher **
 *  Tested up to **6.9.4**
 *  PHP version ** 8.1 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/sqm-views/)
 * Tags
 * [analytics](https://ast.wordpress.org/plugins/tags/analytics/)[metrics](https://ast.wordpress.org/plugins/tags/metrics/)
   [page views](https://ast.wordpress.org/plugins/tags/page-views/)[privacy](https://ast.wordpress.org/plugins/tags/privacy/)
 *  [Advanced View](https://ast.wordpress.org/plugins/sqm-views/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/sqm-views/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/sqm-views/reviews/)

## Contributors

 *   [ Pavel Khloponin ](https://profiles.wordpress.org/schqm/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/sqm-views/)