*** Shop2LLM Changelog ***

2026-09-26 — version 1.5.3 (Standalone Release: WooCommerce Hard Dependency Removed)

* Improvement - Removed `Requires Plugins: woocommerce` from the plugin header and renamed the plugin to "AI Visibility & LLMs.txt — Shop2LLM": the plugin now installs and activates on any WordPress site; WooCommerce remains an optional enhancement (shop_to_llm_has_woocommerce() detection + site_mode auto content/commerce already shipped, no option migration needed)
* Improvement - readme.txt rewritten for standalone positioning: title de-suffixed, tags optimized to the 5-tag WordPress.org directory limit (ai-visibility, ai-seo, chatgpt, llms-txt, woocommerce — verified via the official readme validator, which ignores tags beyond 5), WooCommerce moved to optional in Requirements + FAQ + How It Works + Description
* Feature - /ai-visibility/ verification page footer upgraded from a plain "Powered by" line to a prominent CTA card linking to the WordPress.org listing (viral loop: front-end badge → verification page → directory)
* Feature - Review ask at the value-first moment: the one-time "AI can see your store" first_search success banner now includes a ★★★★★ rating link to wordpress.org/support/plugin/shop2llm/reviews
* Dev - tests/shop_to_llm_structure_test.php: 'Requires WooCommerce' check replaced by standalone assertions (no Requires Plugins header, no "for WooCommerce" name suffix) plus a 1.5.3 version assertion

2026-09-26 — version 1.5.2 (Admin IA: SEO Settings Relocated)

* Feature - Real SEO settings moved into the SEO tab: a new "SEO Settings" sub-tab (default) hosts the 7 SEO module toggles, Title Separator, Homepage Title/Description, Title Templates and Google Search Console credentials, with a dedicated save handler (nonce shop_to_llm_seo_settings) — the main Settings form can no longer overwrite SEO options that are not present in its form
* Improvement - Former "SEO Settings" sub-tab (the SEO/GSC dashboard) renamed "SEO Overview"; sub-tab order is now Settings / Overview / Redirects / Sitemap; legacy ?subtab=settings links keep working (they now show real settings, matching what notices like "Enable it under SEO Settings" promise)
* Fix - tab-seo panel div now closes right after the sub-tab chain instead of only inside the dashboard branch (redirects/sitemap sub-tabs no longer leave the panel div unclosed)
* Improvement - Settings tab telemetry option renamed "Analytics" → "Anonymous Usage Data" to remove the naming collision with the Analytics tab (option key shop_to_llm_analytics unchanged; no data or behavior change)
* Dev - GSC help text updated to reference the SEO Overview sub-tab and the ?tab=seo&subtab=overview redirect URI

2026-09-20 — version 1.5.1 (Activation Funnel Fix: 60s-to-Aha)

* Fix - Activation onboarding completes: the first successful Hero Test Search writes welcome_completed (aha = onboarding done); first attempt may fail (cloud hiccup), a later success still completes — no dead end
* Fix - Hero Test Search is now the FIRST block in the Dashboard tab (Value Card moved below) so the aha moment is above the fold; Value Card behavior (dismissible, re-shows on version update) unchanged
* Feature - Hero query pre-filled server-side with the newest real product/post title (wpdb, WC-agnostic); activation auto-run executes it 1.5s after page load — zero typing to first AI answer
* Fix - Activation auto-search never executed: JS referenced PHP variable heroHasWC (ReferenceError); now uses the pre-filled input value
* Dev - test_search AJAX logs first_search authoritatively server-side (dedup in shop_to_llm_log_event) and returns first_success flag; JS renders a one-time "AI can see your store" banner on first success
* Dev - Removed dead code shop_to_llm_render_welcome_modal() (uncalled since P0-1; was the only welcome_shown source); welcome_shown now fires on first Dashboard view post-activation
* Dev - tests/unit/activation_aha_unit_test.php registered as Suite 8 (24 assertions: first_search semantics + source invariants)

2026-09-20 — version 1.5.0 (Acquisition Layer: AI Referral → Order Attribution)

* Feature - Acquisition Funnel card on the AI Traffic tab: AI crawler visits → AI referral sessions → AI-attributed orders → AI GMV (30-day window, 15-min cache, 100% local — nothing leaves the server)
* Feature - AI order attribution bridge: AI referral sessions are remembered in the WooCommerce session with a first-party cookie fallback (source label only, 30-day TTL, no personal data); on checkout the order is stamped with _shop2llm_ai_order / _shop2llm_ai_platform meta — the same keys Pro's agentic checkout uses, so Pro's AI Revenue tab aggregates these orders automatically
* Feature - AI source matching extended: chatgpt.com, claude.ai, gemini.google.com, grok.com, chat.deepseek.com added alongside the existing map (Perplexity, Copilot, Bing Chat, You.com, Brave, Phind, Kagi); matching logic extracted into a shared pure function used by referral logging AND order tagging
* Dev - New includes/class-acquisition.php (attribution helpers + funnel aggregation + dashboard card); tests/unit/acquisition_unit_test.php (43 assertions) registered as Suite 6
* Note - Per-platform revenue breakdown in the funnel card is a Pro feature (visible but locked)

2026-09-20 — version 1.4.0 (Discovery Layer: Policies, Google Feed, Price/Stock Accuracy)

* Feature - Policy pages become machine-readable: returns/shipping/tax/terms/privacy pages now emit JSON-LD (WebPage + MerchantReturnPolicy / OfferShippingDetails) so AI commerce agents (Claude Commerce Agent answers policy questions only) can quote shipping cost, return window and fees verbatim; slug-based page detection with 6h cache, invalidated on page save; filterable via shop2llm_policy_return_config / shop2llm_policy_schema
* Feature - llms.txt gains a "## Store Policies" section listing detected policy pages (agents discover them without crawling)
* Feature - Site AI Visibility Score grows 7 → 9 factors: Policies (10 pts) and Google Merchant Center feed health (10 pts, local-only checks — Google for WooCommerce detection + merchant connection, no external requests); existing weights rebalanced to keep /100 (robots/llms 15, schema/MCP 12, queries/crawlers 8)
* Feature - Product AI Score grows 9 → 11 dimensions: Sale Price Consistency (sale ≥ regular = fake discount flag) and Stock Status Current (out-of-stock untouched 90+ days = stale listing; variable products require at least one purchasable in-stock variation); free tier max 55 → 70, Pro dims 8-11 reweighted (total stays 100)
* Dev - New includes/class-policy-schema.php with pure, unit-tested builders; tests/unit/policy_schema_unit_test.php (56 assertions) registered as Suite 5
* Note - Advanced offer-level enrichment (priceValidUntil, per-variant hasVariant nodes, review entities) remains a Pro feature

2026-09-20 — version 1.3.14 (Detection Hardening & Listing Accuracy)

* Fix - AI crawler detection now matches the most specific bot pattern first (longest-key-first): "Googlebot-Image/1.0" no longer misattributes to "Googlebot"; same fix applied to PerplexityBot-1, Applebot-Extended, Amazonbot-Image, Bytespider-Image; empty User-Agent short-circuits
* Docs - Listing accuracy sweep: 2 MCP tools (not 23), 81 crawlers tracked (not 65), 51 robots.txt AI bot allow directives (not 12); dashboard/UCP check/empty-state copy now derive counts from the live registry instead of hardcoded numbers

2026-09-20 — version 1.3.13 (Search Terms: GEO/AEO)

* Docs - readme description now references GEO (Generative Engine Optimization) and AEO (Answer Engine Optimization) — covers the emerging query families merchants use for AI visibility services; no code changes

2026-09-20 — version 1.3.12 (Docs Alignment — WooCommerce Required)

* Docs - readme corrected: Shop2LLM requires WooCommerce 8.0+ (free) and PHP 8.1+; removed contradictory "works standalone / WooCommerce optional" claims left over from the v1.0.7 era (Requires Plugins: woocommerce header has been live since 1.3.9)
* Docs - Requirements FAQ now states PHP 8.1+ (matches Requires PHP header, live since 2026-07-29) and WooCommerce required; How It Works now starts with installing WooCommerce

2026-09-20 — version 1.3.11 (Activation & Value Proof)

* UX - Onboarding wizard steps now show real completion states (green ✓): published content, ChatGPT connection, llms.txt/robots.txt readiness, and first AI activity — with a direct "Fix in AI Score card" link
* UX - Hero Test Search results end with a value-closure footer ("this is what ChatGPT users see") and a one-click jump to the AI Score card
* UX - AI Traffic empty state is now a 3-point diagnostic (robots.txt / llms.txt / published content) with inline fix actions instead of a dead-end message
* Feature - AI Score 7-day trend: daily score snapshots (rolling 30 days, incremental) with an up/down delta badge on the dashboard
* UX - Day-7 review fallback notice (or earlier on first score improvement) — permanent dismissal, no incentives; complements the existing first-crawler milestone review prompt

2026-09-11 — version 1.3.10 (Product Schema Priority Fix)

* Fix - Product schema is no longer replaced by meta-driven schema types (FAQ/HowTo) on product pages: the Product JSON-LD — the primary AI-crawler entity (offers.price, GTIN, rating) — is always emitted, with extra types added as additional blocks

2026-09-07 — version 1.3.9 (AI Score Free-Tier Gating)

* UX - AI Score auto-fix actions and dimension groups (Categories/Tags/Stock/Attributes, Content L2-L5, UCP Checkout Kit) gated behind Pro upgrade; free users see diagnosis + upgrade hooks with adjusted displays (e.g. /65)

2026-07-26 — version 1.3.8 (SEO Sub-menu Consolidation)

* UX - Merged `Redirects` and `Sitemap` sub-menus into the main `Shop2LLM → SEO` tab as sub-tabs
* UX - WP admin sidebar now shows a single `Shop2LLM` entry instead of three
* UX - Added `nav-tab` sub-navigation inside SEO tab (`SEO Settings` / `Redirects` / `Sitemap`)
* Compat - Old URLs (`?page=shop2llm-seo-redirects`, `?page=shop2llm-seo-sitemap`) auto-redirect to new sub-tab locations

2026-07-26 — version 1.3.7 (MCP Spec Compliance Fixes)

* Fix - MCP `initialize` returns dynamic `protocolVersion` (echoes client-requested version, defaults to `2025-06-18`) instead of hardcoded `2025-11-25`
* Fix - MCP `notifications/*` requests return HTTP 202 with empty body per MCP 2025-06-18 spec (previously returned `-32601 Method not found`)
* Fix - MCP `tools/call` results wrapped in `content[] + structuredContent` structure per spec
* Fix - Discovery manifest `mcp.version` synchronized to `2025-06-18`

2026-07-07 — version 1.3.6 (6-Tab IA + PHP 7.4 Compat + CSS Fix)

* Feature - 6-tab Dashboard layout (Overview, AI Agents, AI Traffic, SEO, Analytics, Settings) with UCP Score + MCP + /agents.md + 65 crawlers in AI Agents tab; crawler analytics + GA4 + AI search in AI Traffic tab
* Fix - UCP Score gauge SVG displays at correct size (CSS selector fix) + PHP 7.4 compatibility (removed union return types, added str_contains polyfill)
* Compliance - 0 Plugin Check ERROR, 0 Plugin Check WARNING maintained

2026-07-07 — version 1.3.5 (GA4 + Crawler Analytics + CJK + UI Refresh + Zero WARNING)

* Feature - GA4 AI Traffic Integration + AI Crawler Log Analytics (65 crawlers, opt-in) + CJK Content Optimizer (Chinese/Japanese/Korean N-gram analysis)
* Feature - Dashboard visual refresh — UCP Score radial gauge (SVG), design token system, empty states, micro-interactions, mobile-responsive layout, dark mode
* Fix - All Plugin Check warnings resolved to zero; security hardening (wp_safe_redirect, nonce verification)

2026-07-07 — version 1.3.4 (UCP Readiness + /agents.md + Live Extractability + 65 AI Crawlers)

* Feature - UCP Readiness Score (7 dimensions, 100 points) + /agents.md endpoint + /llms-full.txt alias — AI agents can assess and access your store
* Feature - Live Content Extractability (10 dimensions) in Classic & Gutenberg editors + AI Crawler Registry expanded to 65 bots
* Compliance - All i18n wrapped; no phone-home; no compensated reviews; WP.org Guideline 6 compliant

2026-07-05 — version 1.3.3 (WP Guideline 7 Compliance & Bug Fix)

* Privacy - Removed auto-ping on activation (WP Guideline 7); ping now only sent when user enables Analytics
* Privacy - Removed auto product sync on activation (WP Guideline 7); added opt-in Product Sync consent (Settings → Shop2LLM → Product Sync), defaults to disabled
* Feature - Added Restart Onboarding button (Settings → Shop2LLM → Onboarding) for users who skipped the wizard
* Code Quality - Added explicit PHP/WP version compatibility check on activation (prevents fatal errors on incompatible environments)
* Performance - Cached uninstall confirmation DB queries in transient (reduces plugins.php page load overhead)
* UI - Onboarding banner no longer shows on the plugin's own page (reduces notification clutter)
* Bugfix - Fixed 'heroRemaining' JS ReferenceError on activation (props WP.org Plugin Tests)

2026-07-02 — version 1.1.2 (Plugin Check Compliance — Zero ERROR, Zero WARNING)

* Compliance - Fixed all 428 Plugin Check ERRORs: 425 TextDomainMismatch, 2 OutputNotEscaped, 1 parse_url
* Compliance - Fixed all 170 Plugin Check WARNINGs: 153 DB query (DirectQuery/NoCaching/PreparedSQL/UnescapedDBParameter/SchemaChange), 12 NonPrefixedVariable, 2 NonceVerification, 2 NonPrefixedHookname, 1 error_log
* Compliance - Plugin Check now reports 0 ERROR + 0 WARNING (clean pass)
* i18n - Text domain unified from 'shop2llm' to 'shop-to-llm' across 425 i18n function calls (__(), _e(), esc_html__(), esc_attr__(), etc.)
* i18n - Plugin header Text Domain updated: shop2llm → shop-to-llm
* i18n - load_textdomain() call updated to use 'shop-to-llm'
* i18n - Translation file path pattern updated: /languages/shop2llm-{locale}.mo → /languages/shop-to-llm-{locale}.mo
* i18n - 28 translation files renamed: shop2llm-{locale}.po/mo → shop-to-llm-{locale}.po/mo (14 languages × 2 files)
* i18n - .pot template file renamed: shop2llm.pot → shop-to-llm.pot; X-Domain header updated
* Security - class-citation-widget.php L52: $citedCount now wrapped with esc_html() before output
* Security - class-citation-widget.php L53: $totalChecks now wrapped with esc_html() before output
* Compatibility - class-citation-widget.php L23: parse_url() replaced with wp_parse_url() (WordPress compatibility function)
* WP.org - Text domain now matches plugin directory name (shop-to-llm), enabling translate.wordpress.org community translations
* Backward compat - Menu slug 'shop2llm' kept unchanged (changing would break existing admin URLs)
* Backward compat - JS object name 'shop2llm' in wp_localize_script kept unchanged (changing would break frontend JS)
* Backward compat - All option names, transient keys, cron hooks, table names with 'shop2llm_' prefix kept unchanged

2026-07-02 — version 1.1.1 (Hero Test Search — ChatGPT-style Aha Moment)

* UX - Hero Test Search box at top of Dashboard: prominent yellow gradient card with input + "Ask ChatGPT →" button
* AI - FinCore cloud LLM proxy (api.shop2llm.com/fincore/v1/free/ai-test) generates natural-language reply using user's local search results; no API key required from user
* AI - 5 free tests per day per site; server-side quota enforcement (site_hash based), local transient counter is UI hint only
* AI - Graceful degradation: 429 returns localized quota-exhausted message; other errors return empty string (UI falls back to plain product list)
* AI - Lightweight payload: only name/price/currency/in_stock/rating sent to cloud (no images, no full descriptions); query truncated to 200 chars, product names to 120 chars
* UI - Rich product cards: 48x48 thumbnail (with 📦 placeholder fallback), currency-aware price, ● In Stock / Out of Stock badge, ★ rating, short description (truncated to 120 chars), "View →" link
* UI - Quota badge top-right: "N tests left today", updates in real time after each call; turns red when 0
* UI - Loading spinner + "Asking ChatGPT about your store..." message during cloud call (15s timeout)
* UX - Score-card "Test Search" button (stl-test-search-btn) now scrolls to Hero box and focuses input (replaces hidden inline panel #stl-test-search-box which has been removed)
* UX - "Fix All" button's test_mcp action now calls window.shop2llmFocusHeroSearch() instead of clicking the old inline button
* i18n - All new strings translation-ready: "See how ChatGPT sees your store", "Ask ChatGPT", "ChatGPT-style preview", "tests left today", "matching items found", "In Stock", "Out of Stock", "View", "Powered by FinCore cloud · 5 free tests per day · No API key needed", etc.
* Filter - shop2llm_test_search_daily_limit (default 5) allows programmatic override of local UI hint quota
* Backward compat - Existing AJAX action shop2llm_test_search kept; response shape extended with ai_reply, remaining_quota, daily_limit fields (products field unchanged, only enriched with currency/rating/short_description/url/image_url)

2026-06-25 — version 1.1.0 (MCP Infrastructure Release)

* MCP - SaaS MCP server (mcp-mini-handler.php): cross-store search_products, get_product, trending_products
* MCP - 2 prompts: shopping_assistant + price_comparison for LLM training
* MCP - 7-platform UA detection: ChatGPT, Claude, Gemini, Copilot, Perplexity, Meta, Google
* MCP - Discovery page at /mcp with setup guide and live stats
* MCP - Grafana monitoring (8 panels) + exposure tracking (fc_mcp_search_exposure)
* Index - fc_product_index: server-side tier detection via license lookup
* Index - cron-pull-product-feeds.php: daily pull from store /product-feed.xml
* Index - seed-stores-from-json.php: import 4238 benchmark domains as seed stores
* Revenue - UTM attribution: search → click → order chain (utm_source=shop2llm)
* Revenue - fc_store_revenue: aggregated GMV per store/month, synced via heartbeat
* Revenue - _shop2llm_ai_order meta on UTM/session-detected orders for dashboard
* Plugin - Feed sync on activation + daily cron, independent of analytics opt-in
* Plugin - shop2llm_disable_product_sync filter for opt-out (WP.org compliance)
* Pro/Ultra - Revenue snapshot included in daily product feed sync
* Pro/Ultra - AI order attribution for dashboard revenue display
* Readme - WP.org compliance: full data disclosure, layered privacy model update
* Docs - Technical architecture document (docs/mcp-technical-architecture.md)

2026-06-24 — version 1.0.9

* Analytics - Cloud heartbeat weekly → daily
* UX - Welcome Modal simplified to single card with opt-in
* UX - Welcome Modal shows plugin icon instead of checkmark

2026-06-23 — version 1.0.8

* Trust - Queries & Crawlers scores now fully open in free tier with real calculation (Focus Query coverage ratio + 30-day AI crawler activity), freeMax restored to 100
* Trust - Removed all anchoring-effect copy: "Free tier max: 80/100", "Free max: 80/100 · Pro +20", 🔒 icons, PRO badges on score rows
* Trust - "Fix All Items" button now transparent: shows "Auto-fixed X · Y need manual action", highlights manual items in yellow with scroll-to positioning
* Security - MCP search now restricts post_type to post/page and excludes password-protected content (has_password => false)
* UX - Reduced CTA density: removed Pro upsell from search analytics notice, connection guide pitch, and plugin list action link
* Compliance - Removed class_exists('Shop2LLM_Pro_Visibility_Score') conditional; free version behavior no longer varies based on Pro presence
* UX - First-Run Welcome Modal: full-screen 3-step overlay after activation (Copy AI URL → Test search your own content → Add to ChatGPT). Inline test search delivers the "Aha moment" without leaving WordPress
* Bugfix - Test search handler now correctly iterates $results['products'] instead of $results wrapper array (was returning "Unknown" for all results)
* Retention - First AI crawler visit now triggers wp_mail() to admin (Day 1-7 retention hook — brings users back even when not logged in)
* Retention - Aha-moment review request: Welcome Modal shows ★★★★★ rating link immediately after first successful inline search (localStorage-gated, shows once)
* Marketing - readme.txt free version description reframed from limitation ("supports ChatGPT with 2 tools") to value ("searchable + 12 crawlers + visibility score + no limits")
* Analytics - Layered privacy model: Layer 1 local behavior summary (shop2llm_behavior_summary option, no opt-in needed, never leaves server); Layer 2 opt-in anonymous bucketed summary uploaded via monthly heartbeat; Layer 3 opt-in AI crawler visit reports
* Analytics - New shop_to_llm_log_event() core function + shop2llm_log_event / shop2llm_enable_analytics AJAX handlers (nonce-verified, capability-checked)
* Analytics - Welcome Modal JS now fires AJAX events: welcome_shown, welcome_completed, welcome_skipped (with step), url_copied, first_search (with success flag)
* Analytics - Opt-in card shown after Welcome Modal completion ("Help us improve Shop2LLM" — Yes/Not now), defaults to off, toggleable in Settings
* Privacy - All behavior summary fields bucketed or boolean to prevent fingerprinting: content_count (0/1-4/5-20/21-100/100+), dashboard_visits (1/2-5/6+); no PII, no IP, no email, no exact counts
* Privacy - readme.txt FAQ rewritten with full layered data disclosure listing every collected field and opt-in mechanism

2026-06-21 — version 1.0.6

* Feature - Works without WooCommerce — supports any WordPress site (content search via posts/pages)
* Feature - BlogPosting JSON-LD schema on single posts when WooCommerce absent
* Feature - Content search via MCP tools using WordPress posts/pages fallback
* Feature - llms.txt shows site posts when WooCommerce absent
* Fix - Removed fatal wp_die() on activation without WooCommerce — replaced with dismissible admin notice
* Fix - Graceful degradation for all WooCommerce-dependent features (product feed, AI score, quality checks)
* Fix - Unified domain to shop2llm.com across all links (action links, API calls, Pro CTAs)
* Update - Plugin description and readme now mention standalone WordPress support

2026-06-21 — version 1.0.6

* Compatibility - Lowered PHP requirement from 8.1 to 7.4 (replaced match expressions with switch, added str_starts_with polyfill)

2026-06-17 — version 1.0.6

* Performance - Dashboard load time 80x faster (5s → 62ms) — 7 transient reads merged to 1, blocking HTTP removed
* Performance - Community stats load async via JS REST fetch (non-blocking)
* Performance - Removed duplicate get_recent_searches() call
* Performance - Replaced wc_get_products(5) with lightweight EXISTS SQL for peer comparison
* Performance - Crawler detection moved from parse_request → wp hook (frontend only, admin/AJAX/REST exclude)
* Performance - Crawler report: non-blocking HTTP, 1s timeout, circuit breaker (backoff on 4+ failures)
* Performance - MCP counter writes batched (15s lock window, no race conditions under concurrency)
* Performance - MCP rate limit: 60 req/min, returns 429 for excess
* Performance - llms.txt cached (1h), invalidated on product save — eliminates 100 WC_Product OOM risk
* Performance - Product quality check cached (1h) — avoids large postmeta JOIN on every dashboard load
* Performance - Community stats endpoint: shutdown-deferred fetch, concurrent-fetch lock
* Security - Unauthenticated endpoints serve from cache only, no HTTP call on request
* Fix - 20 concurrent admin page < 300ms, 30 concurrent MCP < 230ms under stress test

2026-06-15 — version 1.0.5

* Conversion - AI Growth Progress card with 5-step milestone tracker + progress bar
* Conversion - Peer Comparison card (Your Score vs Avg Free vs Pro Users)
* Conversion - Smart Dynamic CTA: 3-tier messaging based on crawler/search activity
* Conversion - 4 Achievement Badges (Store Live / AI Discovered / First Search / Power User)
* Conversion - Greyed-out Pro-only platform cards with hover tooltip
* Conversion - Inline Pro upgrade links in every dashboard card (17 CTAs total, unified color)
* Conversion - Feature adoption nudge for first-time visitors
* Conversion - Community social proof bar (weekly download stats from cloud)
* Conversion - Review request trigger on first crawler + first search milestone
* Conversion - Always-visible 5-star review prompt in dashboard header
* Fix - Domain update: aiproductscout.shop → shop2llm.com for all Pro landing links
* Fix - PHP warnings: undefined $crawlerCount / $searchCount in AI Growth Progress
* Backend - New /v1/stats public endpoint for community stats
* Backend - Fixed /v1/free/ping route (was missing)
* Fixed - PostgreSQL compatibility (AUTO_INCREMENT → SERIAL, ENGINE → removed, inline INDEX → CREATE INDEX)
* UI - Unified Pro CTA color to indigo #6366f1 across all cards
* UI - Wizard progress bar with step counter (2/4 style)

2026-06-14 — version 1.0.4

* Privacy - Anonymous activation ping with SHA256-hashed site identifier (replaces plain site_url)
* Feature - Monthly cloud heartbeat ping to distinguish active vs inactive installs
* Privacy - Removed site_name from telemetry; only hashed hostname sent
* Endpoint - Migrated from /v1/free/register to /v1/free/ping

2026-06-07 - version 1.0.2

* Added - HPOS (High Performance Order Storage) compatibility
* Added - WooCommerce Marketplace support
* Fixed - Remove invalid contributor

2026-06-04 - version 1.0.1

* Fixed - permission_callback granting access when API key is empty
* Fixed - Settings save clearing API key from missing form field
* Fixed - Author URI and readme URLs
* Fixed - Add wp_unslash before sanitize_text_field on POST inputs
* Fixed - Proper escaping for dynamic HTML attributes and display values
* Removed - load_plugin_textdomain (WP 4.6+ auto-loads)
* Update - Tested up to 7.0

2026-05-29 - version 1.0.0

* Initial release
