Follow for free plugins, new theme releases and theme news
Plugin 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 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
- Lightweight JavaScript tracker injected on tracked pages (inline or external)
- Fast endpoint receives tracking data
- File-based storage for raw data writes data to JSONL files (no database overhead)
- Background processing via WP-Cron aggregates data hourly/daily and put them in the database
- 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
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 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 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 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 upgrade process (2 params: $from_version, $to_version)
* sqm_views_after_upgrade – Fires after 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