TL;DR at a glance

New fields shipping
+160
across 18 categories
Already shipping today
22
unchanged, kept for compat
Removed this pass
−2
install_uuid, install_first_seen_at
Pro vs Both
Pro-only
Lite payload unchanged

What this PR does: Extends the existing weekly usage payload sent to aiousage.com/v1/track with ~160 additive top-level fields — installation context, environment, feature toggles, content aggregates, AI / notification / writing-assistant / SEO-analyzer / GSC / redirect / revision counts, addon matrix, and WooCommerce — on Pro installs only. Lite payload is bit-for-bit identical to develop. Endpoint unchanged. Cadence unchanged (weekly, Action Scheduler). Opt-in unchanged (existing usageTracking toggle for Lite, default-on for Pro).

Privacy contract rules of the road

What we DO collect

  • Counts (e.g. redirects_total, posts_with_focus_keyphrase_count)
  • Timestamps (e.g. last_post_published_at)
  • Booleans (e.g. gsc_site_verified, feature_breadcrumbs_enabled)
  • Enum values and enum distributions ({type: count})
  • Arrays of slug strings (which features have non-empty config)
  • Schema-type names, error codes, HTTP codes, internal status enums

What we NEVER collect

  • Post titles, descriptions, content, slugs, or user-authored URLs
  • Focus keyphrase text (count only)
  • Schema body / template body
  • Business addresses, phone numbers, geo coordinates
  • API keys, OAuth tokens (existing redaction preserved)
  • Client IPs, user-agents, referrers
  • Per-redirect source/target URLs
  • Per-keyword text (Search Statistics, Writing Assistant)
  • Derived scores, ratios, or computed maturity tiers

Decisions log since initial PR draft

2026-05-25
install_uuid + install_first_seen_at removed retroactively. Pre-merge edit to PR #8230. Both were Phase-1-new, no breaking change to receiver.
Remove
2026-05-25
Added admin_email_hash field. Plain email continues to ship as before; hash is for stable join key. Salt is server-side (Shape A): plugin sends plaintext, warehouse hashes on receive.
Add
2026-05-25
Confirmed: existing url field (home_url) stays. Removing it would break receiver-side joins shipped in production for years.
Keep
2026-05-22
Outstanding blocker: aioseo_redirects* tables queried without tableExists() guards (5 tables, Pro/Admin/Usage.php L246). Fatals weekly on installs without Redirects bootstrap. Will be fixed pre-merge.
Fix pending
2026-05-18
11 same-table query consolidations applied. getAioseoPostsAggregateRow() helper collapses 4 wp_posts scans and 4 aioseo_posts MAX() scans into single passes.
Fixed
2026-05-15
wp_is_block_theme() phpcs sniff, 305-char @version line, multisite UUID scoping, social-URL array formatting, 75 alignment warnings.
Fixed
Both (Lite + Pro) Pro only New in this PR

Phase 1 inventory ~180 telemetry data points · expand each category

Pre-existing fields (already shipping today, unchanged)

22 fields · kept for backward compat

1 Installation context

7 fields · 6 from wizard/install · 1 NEW (email hash)

2 Environment

9 fields · PHP/WP runtime + debug

3 Site configuration

8 fields · permalinks + post types + content access

4 Feature enablement (toggles)

16 fields · which AIOSEO features are switched on

5 Feature adoption (counts)

16 fields · how much each feature is used

6 Usage frequency (timestamps)

9 fields · last-X-at signals, no event stream

7 Content optimization (post-level aggregates)

16 fields · counts over aioseo_posts table

8 Schema usage

3 fields · which schema types are emitted

9 Term-level configuration Pro

6 fields · taxonomies are a Pro feature

10 AI feature usage

11 fields · credits + AI Insights

11 Writing Assistant

5 fields · usage of the keyword research tool

12 SEO Analyzer

6 fields · site-wide analysis results

13 Search Statistics / GSC Pro

14 fields · Google Search Console integration

14 Redirects Pro

13 fields · redirect rules + 404 logs

15 SEO Revisions Pro

4 fields · per-post SEO history

16 License flags Pro

8 fields · raw flags, no derived "state"

17 Addon install / version matrix

6 sub-fields × 12 addons = 72 values

19 WooCommerce integration

3 fields · only when Woo is active

Phase 2+ scope deferred — not in this PR, separate sign-off when ready

Phase 1.5 — same shape, small follow-up

Cheap snapshot additions

Net-new primitives that don't need new infra. Suggested as one small follow-up PR.

  • Object-cache backend enum (Redis/Memcached/WP-Rocket/none)
  • Cron mode enum (real-cron/disable/AS)
  • Update channel bool (auto-updates enabled)
  • Site-wide schema type (Org/Person/WebSite/none)
  • GSC auth state enum + PageSpeed bool
  • users_by_role distribution
  • Multilingual language count, EDD product count
  • Multisite override counts
Phase 2 — engagement counters

Admin UX + upsell funnel

Requires a tiny new counter mechanism (wp_options key incremented on Vue routes and key surfaces). Highest product value of any phase.

  • Admin page-view counts per Vue route
  • Setup wizard step entered / completed / skipped
  • Bulk editor, Tools, metabox open counts
  • Notification shown / clicked / dismissed
  • Upsell modal opens + upgrade button clicks
  • OAuth initiated / completed / abandoned
  • License entry attempts
Phase 3 — error capture

DB-error wrapper

Tiered $wpdb error capture with dedupe by (errno, query fingerprint, context). No query values, no table data — just errno + fingerprint hash.

  • Tier 1: schema bugs (1146 table-missing, 1054 unknown-column, 1064 syntax)
  • Tier 2: dbDelta mismatches (1050 already-exists, 1060 duplicate-column)
  • Tier 3: concurrency (1213 deadlock, 2006 server-gone-away)
  • Tier 4: rate-limited duplicate-entry / encoding issues
Phase 4 — addon contributions + perf timing

Per-addon primitives + p50/p95

Each addon adds primitives to its own addon_data entry. Plus performance-timing wrappers around heavy paths.

  • Link Assistant: links / suggestions / scan timestamps
  • BLC: broken links by status + last scan
  • Local Business: location count + maps key present (bool only)
  • Sitemap / TruSEO / AI / GSC p50 / p95 duration

Sign-off

Once you've reviewed each category above, check each statement below, fill in your name and date, and click Generate sign-off. Copy the resulting block into the PR conversation as your approval.

Check all boxes and fill in your name to enable