TL;DR at a glance

New fields shipping
+162
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 ~162 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-26
Added redirects_auto_slug_change_total (14.14) + redirects_auto_deleted_post_total (14.15) — lifetime event counters incremented inside Monitor::addRedirect() / Monitor::postTrashed(), persisted via aioseo_telemetry_auto_redirect_{slug,trash}_count wp_options (autoload=false). Answers Arnaud's two asks (slug-change auto-redirect volume + deleted-post-notice volume) as true creation counts that don't drift when users toggle redirects. No retro-active backfill — existing installs start at 0 from PR-deploy date.
Add
2026-05-26
Removed the earlier proxies redirects_modified_enabled_count + redirects_modified_disabled_count. Code-walk on Pro\Redirects\Main\Monitor confirmed the schema has no creation-source column on aioseo_redirects: addRedirect() writes enabled=1 and postTrashed() writes enabled=0, but both flags are mutable. addRedirect() also flips other rows to enabled=0 at L103–108, so the proxy mislabels them as "pending deleted-post". Replaced by the event counters above.
Remove
2026-05-25
Added redirects_modified_enabled_count (14.14) + redirects_modified_disabled_count (14.15) per Arnaud's review. Splits the 'modified' group (auto-redirects) by enabled flag — proxies slug-change vs. deleted-post-notice creation paths. Superseded 2026-05-26 by 14.14 / 14.15 lifetime counters.
Add
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

15 fields · redirect rules + 404 logs · 2 lifetime event counters for auto-redirects (per Arnaud)

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