Title: AttentIQ
Author: Mus Code
Published: <strong>April 8, 2026</strong>
Last modified: April 8, 2026

---

Search plugins

![](https://ps.w.org/attentiq/assets/banner-772x250.png?rev=3501725)

![](https://ps.w.org/attentiq/assets/icon-256x256.png?rev=3501725)

# AttentIQ

 By [Mus Code](https://profiles.wordpress.org/muscode/)

[Download](https://downloads.wordpress.org/plugin/attentiq.1.2.3.zip)

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

 [Support](https://wordpress.org/support/plugin/attentiq/)

## Description

AttentIQ tracks how readers actually engage with your content — measuring attention
time per paragraph, scroll depth, and ad slot viewability across desktop and mobile
devices. It uses this data to automatically place ads at the exact paragraphs where
readers spend the most time, maximizing ad revenue without guesswork.

**Free Features**

 * Attention score per post based on content analysis
 * Automatic in-content ad placement based on content structure
 * Header, in-content, and footer ad slot support
 * Per-post meta box with slot score breakdown
 * Dashboard overview of all tracked posts
 * Confidence and decay badges

**Pro Features**

 * Paragraph-level attention heatmap (desktop & mobile)
 * Device-split attention data — separate mobile and desktop tracking
 * Device-specific ad placement — place ads at each device’s hotspot paragraph
 * Ad slot viewability tracking — see how long each slot stays in the viewport
 * Programmatic revenue estimates per slot
 * Direct sale valuations with CPM multipliers
 * Dual in-content ad placement for high-attention posts
 * Mobile-specific ad codes for header, in-content, and footer
 * Alignment control per ad slot
 * Scroll depth tracking per device
 * Zone timing breakdown (header / mid-content / footer zones)

**How It Works**

 1. AttentIQ tracks how long readers spend on each paragraph using a lightweight JavaScript
    tracker
 2. It calculates slot scores for header, in-content, and footer positions based on
    attention data and content analysis
 3. Ads are automatically inserted at the highest-attention positions
 4. The insights page shows a full breakdown of attention timing, heatmaps, slot scores,
    and revenue estimates per post

**Privacy & Data Collection**

AttentIQ measures how readers engage with your content — including time spent on
each paragraph, scroll depth, device type, and ad slot viewability. This data is
stored exclusively in your own WordPress database and is never sent to any external
server.
 No personally identifiable information (name, email, IP address) is collected
or stored. To detect unique visits per post, a `localStorage` entry (`attentiq_seen_[
post_id]`) is written to the visitor’s browser. No cookies are set. Site owners 
can disable all frontend tracking at any time by adding the following to their theme
or a plugin: add_filter( ‘attentiq_enable_tracking’, ‘__return_false’ ); AttentIQ
also registers suggested text for your site’s Privacy Policy page (Appearance  Privacy
Policy) via the WordPress privacy API.

### Revenue Estimates Disclaimer

Revenue figures shown in AttentIQ (programmatic revenue per slot, direct sale estimates,
RPM calculations, and monthly forecasts) are **estimates only**. They are calculated
using industry-standard benchmarks and, where available, your own tracked viewability
and impression data.
 Actual revenue depends on many factors outside AttentIQ’s 
control — including your ad network’s fill rates, seasonal demand, audience geography,
advertiser competition, and your specific ad setup. Results will vary and may differ
significantly from the figures shown. AttentIQ estimates are intended to help you
make informed placement decisions, not to guarantee any particular earnings outcome.

### External Services

This plugin connects to the following external services. All connections are admin-
only — no data from your site’s front-end readers is sent to any of these services.

**Google Fonts** (https://fonts.google.com)
 What it does: Loads the DM Sans and
DM Mono typefaces used in the AttentIQ admin UI. When it connects: On every AttentIQ
admin page load. Data sent: Your browser’s IP address and user-agent are sent to
Google’s servers as part of a standard font stylesheet request. Google Privacy Policy:
https://policies.google.com/privacy

## Screenshots

 * [[
 * AttentIQ Dashboard — attention scores and slot breakdowns for all posts
 * [[
 * Post Insights — paragraph heatmap, zone timing, and revenue estimates
 * [[
 * Ad Code Settings — desktop and mobile ad codes per slot with alignment controls
 * [[
 * [[

## Installation

 1. Upload the `attentiq` folder to the `/wp-content/plugins/` directory
 2. Activate the plugin through the ‘Plugins’ menu in WordPress
 3. Go to **AttentIQ  Settings** and paste your ad codes for each slot
 4. Enable auto ads on individual posts via the AttentIQ meta box in the post editor
 5. Visit **AttentIQ  Dashboard** to view attention scores and insights for all your
    posts

## FAQ

### Does AttentIQ work with page builders?

Yes. AttentIQ detects common page builders (Elementor, Divi, Beaver Builder, etc.)
and switches to JavaScript-based ad injection automatically.

### How long does it take to collect attention data?

AttentIQ starts collecting data immediately after activation. Slot scores become
reliable once a post reaches the minimum views threshold (default: 50 views), which
you can adjust in Settings.

### Does it work on mobile?

Yes. AttentIQ tracks desktop and mobile visits separately (Pro). You can set mobile-
specific ad codes for each slot and choose device-specific ad placement mode.

### Will it slow down my site?

The tracker script is lightweight, loads asynchronously, and only fires after the
reader has been on the page for a few seconds (configurable bounce threshold). It
has no impact on page load time.

### Is my data shared with anyone?

All attention data is stored in your own WordPress database. No post content or 
reader data is sent to external servers. See External Services for details on third-
party services used in the admin UI.

### Can I use AttentIQ with custom post types?

Yes. Go to **AttentIQ  Settings** and select which post types AttentIQ should track
and inject ads into.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

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

Contributors

 *   [ Mus Code ](https://profiles.wordpress.org/muscode/)

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

### Interested in development?

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

## Changelog

#### 1.2.3

 * WordPress.org compliance: admin menu position changed from 25 to 100 — AttentIQ
   now appears below Settings, outside the core WordPress menu hierarchy.

#### 1.2.2

 * WordPress.org compliance: removed `is_premium` from all PHP localized script 
   data — the Pro plugin now injects attention-data flags into the frontend JS via`
   wp_add_inline_script()` only when active.
 * WordPress.org compliance: removed `$is_pro_locked` slot-locking logic and `attentiq_unlocked_slots`
   filter — the Second In-Content slot is added entirely by the Pro plugin via `
   attentiq_slot_definitions`; no slot locking exists in the free plugin.
 * WordPress.org compliance: setup wizard upgrade blocks (`ob_start()` / `apply_filters()`
   pattern) replaced with direct `if (!class_exists('AttentIQ_Pro'))` checks — no
   output buffers left open.
 * Renamed internal JS flag `is_premium`  `use_attention_data` and variables `isPremium``
   hasAttentionData` throughout admin JS — naming now reflects data availability
   rather than a license state.

#### 1.2.1

 * WordPress.org compliance: removed `attentiq_is_pro()` function and all `apply_filters('
   attentiq_pro_active')` calls — pro plugin detection now uses the standard `class_exists('
   AttentIQ_Pro')` pattern throughout.
 * Added `attentiq_upgrade_url()` function — returns the in-admin pricing page URL
   when the Pro plugin is installed, or the external upgrade page otherwise. All
   upgrade links now use this function instead of the `ATTENTIQ_UPGRADE_URL` constant
   directly.
 * Fixed: “Upgrade to Pro” menu item is now hidden when the Pro plugin is installed,
   regardless of license status.
 * Improved: “Upgrade to Pro” menu link now opens in a new tab — implemented via`
   wp_add_inline_script()` for WordPress.org compliance (no raw inline `<script>`
   tags).
 * Setup wizard: Free vs Pro comparison grid, attention scoring note, and upgrade
   card are now passed through `apply_filters()` so the Pro plugin can cleanly suppress
   them — no conditional gating in the free plugin itself.
 * Fixed: `<form>` and `<button>` elements added to `kses_admin_html()` allowlist—
   previously stripped by `wp_kses()`, which caused the Pro plugin’s license activation
   form to silently do nothing.
 * Updated `.pot` translation file.

#### 1.2.0

 * Fixed: infinite loop / timeout on pages and during scans when the `[attentiq_heatmap]`
   shortcode is present in a post with ads enabled — shortcodes are now stripped
   from content before slot scoring to prevent recursive calls.
 * Fixed: “Last Rescanned” timestamp in Post Insights was showing the wrong time(
   up to several hours off) — timestamps are now stored as Unix integers and compared
   correctly regardless of server timezone.
 * Fixed: loading the Post Insights page was silently updating the “Last Rescanned”
   time on every load — rescanned timestamp is now only updated by an explicit Scan
   action.
 * Fixed: Scan All button was returning no results and getting stuck — AJAX handler
   registration is now deferred to `init` so both free and pro plugins are fully
   loaded before handlers are registered.
 * Fixed: Scan All button did not work when rendered inside a form (defaulted to`
   type="submit"`) — button now has explicit `type="button"`.
 * Dashboard: Scan All now processes posts in batches of 10 with a live progress
   bar showing scanned / total count — prevents PHP timeouts on large sites.
 * Fixed: dashboard “Sort by Score” was sorting by raw content quality instead of
   ad value — posts with great structure but almost no traffic (e.g. Privacy Policy)
   no longer outrank high-traffic posts.
 * Improved: introduced Ad Value Score — content quality score multiplied by a log-
   scale traffic weight relative to your site average. Posts below the minimum views
   threshold keep a neutral weight so new content isn’t buried. The ring, sort order,
   and site average all use this score; individual slot scores are unchanged.
 * Fixed: “Total Time on Site Today” dashboard card was always showing empty despite
   views being recorded — caused by `SKIM_SPEED` being set to 3 px/s (any scrolling
   triggered skim mode, dumping all dwell time into an unused bucket). Threshold
   raised to 400 px/s and scroll speed now resets when the user stops scrolling.
 * Fixed: per-post page builder detection now checks post meta (Elementor, Divi,
   Beaver Builder, WPBakery) instead of checking if the plugin class exists site-
   wide — PHP ad injection now works correctly on non-builder posts even when a 
   builder plugin is installed.
 * Fixed: dashboard post cards were silently triggering score recalculations on 
   every load for posts scored before the scoring-mode feature was introduced — 
   empty mode meta no longer forces a recalc.
 * Improved: frontend ad insertion (`auto_insert_ads`) now reads slot scores, revenue,
   and best slot directly from cached post meta — no DB queries or recalculations
   on every page load.
 * Post Insights: score ring now shows Ad Value Score with content quality score
   shown as a secondary line below.
 * Dashboard hero block: tips and to-do messages now rotate randomly from a pool
   of options so the same message isn’t shown every visit.
 * Changed: Freemius SDK removed from the free plugin — license management, upgrade
   checkout, and the My License / Upgrade to Pro pages are now part of the Pro plugin
   only. The free plugin menu links directly to the website upgrade page.
 * Added: `ATTENTIQ_UPGRADE_URL` constant — all upgrade links in the plugin use 
   this single constant, making it easy to update the target URL in one place.
 * Security: heatmap output in Post Insights now escaped with `wp_kses_post()`.

#### 1.1.9

 * Post Insights: tracking status is now shown in the Views Tracked stat block and
   at the top of the Diagnostics card — displays why tracking is off (site-wide 
   filter, post type not tracked, or too few paragraphs).
 * Security: SVG icon variables (`$svg_desktop`, `$svg_mobile`) now escaped with`
   wp_kses()` throughout the Post Insights template.
 * Fixed: hero block today-highlight cards and the dashboard activity ticker now
   include a nonce in their Post Insights links — previously caused “The link you
   followed has expired” errors.

#### 1.1.8

 * License management page moved to the pro plugin via `attentiq_license_page_html`
   filter — license info, billing details, cancel subscription, and plugin sidebar
   all render from the pro plugin when active.
 * Added sidebar to the license page showing installed version, latest available
   version, update notice, and download button.
 * Fixed: stray `?>` tags visible on Post Insights page after escaping pass.
 * Fixed: fatal error on the license page when the pro plugin is not present — all
   license call sites are now guarded with availability checks.
 * Security: added nonce verification to all admin GET parameter reads — Post Insights,
   Setup wizard edit-step, and Advertiser Report pages now require a valid nonce.
 * Security: all nonce-protected links updated to use `wp_nonce_url()`.
 * Security: JS-generated Post Insights links now include a nonce via `wp_localize_script`.
 * Security: wrapped all HTML-returning closures (`$score_bar`, `$heat_bar`, forecast
   icon) with `wp_kses_post()` / `wp_kses()`.
 * Removed dead `$_GET['sort']` code from the dashboard — the JS already uses `attentIQAdmin.
   defaultSort` from `wp_localize_script`.

#### 1.1.7

 * Fixed PHP output on Post Insights page — stray `?>` tags left by escaping pass
   were visible on screen.

#### 1.1.6

 * Fixed scroll depth always recording as 0 — now tracks maximum scroll depth reached
   during the visit.
 * Added site-level unique visitor tracking (dashboard hero block).
 * Fixed paragraph heatmap demo showing locked summary chips to free users.
 * Security: removed dead code branch and added explicit comment for intentionally
   unsanitized ad code fields.
 * Security: fixed unescaped output in slot alignment editor.
 * Performance: removed duplicate scroll event binding that caused double-firing
   on every scroll.

#### 1.1.5

 * Improved paragraph count.
 * Added scan button to post insights page.
 * Improved frontend heatmap UI.
 * Improved manual ad slot positioning.

#### 1.1.4

 * WordPress.org compliance — all inline scripts converted to wp_enqueue_script()/
   wp_localize_script() / wp_add_inline_script()
 * WordPress.org compliance — advertiser report stylesheet now loaded via wp_enqueue_style()/
   wp_print_styles()
 * WordPress.org compliance — removed “Powered by AttentIQ” attribution from public-
   facing advertiser report
 * Privacy — added attentiq_enable_tracking filter so site owners can disable all
   frontend tracking
 * Privacy — registered suggested privacy policy content via wp_add_privacy_policy_content()
 * Dashboard — Active Slots hero stat now shows total recommended ad slots currently
   serving across all posts
 * Dashboard — sub-label on Active Slots card shows count of recommended slots not
   currently serving ads
 * Dashboard — slot counts use the same visibility threshold (score ≥ 50, or best
   slot ≥ 40) used across the plugin
 * Dashboard — dual in-content placement counted as two slots in both active and
   unused totals
 * Dashboard — added ad slot filter dropdown to post list toolbar (All slots / Ads
   enabled / Header / In-content / Footer)
 * Dashboard — toolbar sort buttons collapse to a select at 1280px to keep layout
   intact with two filter dropdowns

#### 1.1.3

 * Major PHP and JavaScript improvements.
 * Further UI improvements for enhanced readability and usability.
 * Translation improvements.
 * Cleaned up CSS stylesheets.

#### 1.1.2

 * JavaScript improvements — added ‘use strict’ to all scripts, replaced shorthand
   event methods with .on(), removed unused code
 * All user-facing strings are now translatable and properly escaped, attentiq.pot
   file included
 * Fixed script and style handle names to remove file extensions

#### 1.1.1

 * Full UI redesign of admin dashboard, post insights, ad slots, and settings pages
 * WCAG AA accessibility compliance throughout — minimum 12px font size, all colours
   meet 4.5:1 contrast ratio
 * Per-post ad slot controls — enable or disable individual slots directly from 
   the post editor
 * Paragraph position sliders — fine-tune where each ad slot appears within its 
   section
 * Per-post ad code overrides — set different ad codes per post without affecting
   global settings
 * Lazy load option per ad slot
 * Reusable slot editor component used across ad slots page and post insights page
 * AJAX scan in post editor meta box — no page reload required
 * Improved mobile responsiveness across all admin pages
 * Dashboard post list with AJAX pagination, search, and sort filters
 * Site-wide slot performance header on ad slots page
 * Setup wizard redesign with cleaner onboarding flow

#### 1.1.0

 * Full UI redesign of admin dashboard and post insights page
 * Improved mobile and tablet responsiveness across all admin pages
 * Paginated post list with AJAX loading, search, and sort filters
 * Setup wizard redesign with cleaner onboarding flow
 * Score rings and slot badges on post cards
 * Paragraph heatmap device tabs integrated into insights page layout

#### 1.0.9

 * Initial release
 * Attention tracking per paragraph, scroll depth, and zone timing
 * Device-split tracking for desktop and mobile
 * Automatic ad placement based on attention data
 * Header, in-content, and footer ad slots
 * Mobile-specific ad codes
 * Paragraph heatmap (Pro)
 * Ad slot viewability tracking (Pro)
 * Revenue estimates — programmatic and direct sale (Pro)
 * Device-specific placement mode (Pro)
 * Custom post type support
 * Alignment controls per ad slot

## Meta

 *  Version **1.2.3**
 *  Last updated **1 day ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 5.9 or higher **
 *  Tested up to **6.9.4**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [ads](https://wordpress.org/plugins/tags/ads/)[heatmap](https://wordpress.org/plugins/tags/heatmap/)
   [monetization](https://wordpress.org/plugins/tags/monetization/)
 *  [Advanced View](https://wordpress.org/plugins/attentiq/advanced/)

## Ratings

No reviews have been submitted yet.

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

[See all reviews](https://wordpress.org/support/plugin/attentiq/reviews/)

## Contributors

 *   [ Mus Code ](https://profiles.wordpress.org/muscode/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/attentiq/)