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

Translate “AttentIQ” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by 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