AI eShop Optimizer — the unified AI commerce suite for WordPress & WooCommerce
AI eShop Optimizer turns your site into an adaptive, self-optimising storefront. One plugin does the work of a whole stack of subscriptions — an AI assistant, product recommendations, a complete in-house SEO engine, first-party measurement and consent, pricing and merchandising, fulfilment and operations, customer intelligence, and plain-language analytics — powered by the latest models from
Anthropic Claude and
OpenAI, with
Voyage AI embeddings for semantic search.
Its guiding principle is
unification of experiences and functionality: every storefront surface shares the same design tokens, containers and controls; every report reads from one canonical source of truth; and the heavy lifting is pre-computed into materialised tables and served by a thin front-end runtime — so each feature adds capability, not milliseconds.
Works with or without WooCommerce — perfect for:
- WooCommerce stores that want recommendations, merchandising, SEO, fulfilment and attribution in one place
- Corporate and content sites that want an intelligent, on-brand chat assistant
- Merchant and information sites that need AI-powered customer support
You can adopt it one capability at a time. Almost everything ships off by default and runs alongside your existing tools (your current SEO plugin, your pixel manager, your CMP) until you choose to switch each piece on — so installing changes nothing until you flip a toggle.
Extract the contents of this plugin zip file into your wp-content/plugins/ directory locally.
Upload the extracted folder to your website.
Navigate to wp-admin/plugins.php on your dashboard.
Find 'AI eShop Optimizer' and activate the plugin.
Alternatively, install directly through WordPress:
Go to the 'Plugins' menu in WordPress.
Click 'Add New' and search for 'AI eShop Optimizer.'
Install and activate directly from your dashboard.
8.0 "Fable / Mythos 5" - 2026-06-14
Refactored with Anthropic's Fable / Mythos 5. Marketplace-feed URLs refined, plus a proper attribute-driven product-colour pipeline for SEO and feeds.
- Absolute marketplace-feed links. Products with an SEO canonical were being exported with a relative
<g:link> (no domain), so Google / Skroutz silently dropped them. The catalogue build now absolutises the canonical into the core-vitals product URL, with a defensive absolutise at feed output (the sitemap and the on-page canonical tag were already correct).
- Product colour from your attributes. A new "AIEO colour context" flag (Products → Attributes, with a one-click bulk action) marks which swatch attributes represent a colour; the catalogue build then reads the term NAME (e.g. "French Caramel") into the product colour used by the JSON-LD schema and the marketplace feeds — real per-variant values, not slugs. Replaces the old title-guess heuristic and completes the 7.4 colour follow-up (parents stay clean: Google carries colour on each variant +
variesBy:color).
7.4 - 2026-06-12
Merchant-listing & Local SEO schema completeness — clear Google Search Console's "missing field" warnings across Product and LocalBusiness, plus a clean Channel view for attribution. Requires WordPress 7.0+.
- Product
color on every product. The Product / ProductGroup schema now always emits color, read from the core vitals colour — real per-variant values on variable products, present-but-empty on simple products until you map a colour-denoting attribute (a guided follow-up; see documentation/SEO_SCHEMA_NEXT_OPTIMIZATIONS.md).
- Shipping & returns on every Offer. New SEO → Schema settings emit
OfferShippingDetails + MerchantReturnPolicy on each product Offer — return window + free-returns flag, shipping rate, handling/transit days, country — off until you enter your real terms (inaccurate values trigger Merchant Center issues).
productGroupID length handling. Variable products with a long slug-style SKU now stay within Google's "invalid string length" limit — the group id falls back to the stable product ID (≤50 chars).
- LocalBusiness
priceRange + image per store. The Locations & Reviews editor gains a Google price-tier selector (€…€€€€) and a media-gallery image picker; both flow into each store's LocalBusiness node, clearing the "missing image / priceRange" warnings.
- UTM Explorer — Channel dimension. A new top-level "Channel" breakdown (the resolved marketing channel) with consolidated, friendly labels — Google – Paid cleanly separated from Organic Search, plus Facebook – Paid, Direct, Skroutz, etc. The Source view also splits paid Google out of the organic
google bucket.
- Attribution accuracy. Order analytics now bucket by the site's configured timezone (matching WooCommerce Analytics day-for-day), and self-referral ("internal") folds into "(direct)".
7.3 - 2026-06-10
In-house SEO engine — a faster, Greek-aware replacement for AIOSEO/Yoast: rich commerce + local-business schema, image SEO, redirects and a static sitemap, all served from materialized data at ~0 ms. It runs behind your current SEO plugin until you flip the switch, so installing 7.3 changes nothing until you cut over.
- AIEO SEO module (new). A complete on-page engine — title / meta description / canonical / robots / Open Graph / Twitter + JSON-LD — built once into a head cache and served by the thin runtime in a single cached read (no per-request assembly, no Vue admin, no telemetry; ~0 ms added TTFB vs the 100–300 ms a competitor adds). Augment-only behind an existing SEO plugin until enabled.
- Canonical-category control. Pin one canonical category per product (AIOSEO's "primary category"); a single resolver drives the permalink, the
<link rel=canonical> and the sitemap entry together. Editor "SEO" metabox + a chunked bulk "set for all products" tool.
- Rich commerce schema (all vitals-driven, never live Woo queries). Variable products emit
ProductGroup + hasVariant/variesBy (Google no longer collapses them to a single collapsed item); sale prices carry a UnitPriceSpecification strikethrough; plus gtin, brand, and operator-configured MerchantReturnPolicy / OfferShippingDetails. Category, brand and tag archives emit CollectionPage + a product ItemList + BreadcrumbList + inLanguage.
- Local SEO (multi-store). A
LocalBusiness node per physical store (from your Locations & Reviews / Google locations) — opening hours, geo, Maps/Rate links — under the Organization graph, with one location pinned as HQ. New Store Locator, Opening Hours and Business Info blocks (+ shortcodes), and an optional store-page post type whose URL base + label you choose (nothing is hardcoded). Store pages get their own sitemap entries.
- Image SEO. Auto-fills EMPTY product featured-image alt text from the product title/template (your set alts are preserved) and adds one
<image:image> per product to the sitemap for Google Images.
- Redirects + automatic slug monitor. A full redirects engine: rename a product/post and the old URL keeps working (auto 301), a unique-404 list with one-click "Create redirect", served at the nginx edge with a PHP fallback for portability.
- Static, outage-proof sitemap. Cron-built to static
.xml shards (≤2000 URLs each + an index), served as files — it keeps serving even if the plugin is deactivated.
- SEO score, health dashboard & AI Assist. A live 0–100 score + checklist in the editor, a demand-ranked "SEO Health" dashboard, and one-click Claude AI Assist (generate/improve title, meta description, summary, keyphrases) — Greek-native.
- AIOSEO → AIEO migration + pre-cutover verify. A read-only importer copies your entire AIOSEO configuration (per-object meta, global settings, image-alt format, redirects) with a mapping report — and STRIPS deprecated FAQPage/HowTo schema. A one-click head-parity verify compares the head AIEO would emit to your live head over a sample (title/canonical/robots) before you enable the engine and deactivate AIOSEO.
- EU Omnibus. A 30-day-lowest-price history feeding the compliant reference price.
- Multilingual. Per-language head + hreflang for WPML/Polylang; a TranslatePress-aware sitemap.
- Core vitals carry the canonical. Each product's stored URL in the core vitals table is now its SEO canonical (where one exists), so feeds and on-page agree; the field is bounded (300 chars) so an over-long canonical is safely truncated and the catalogue build stays unaffected.
- Editor blocks discoverable again. All AIEO blocks now appear in the inserter regardless of a theme's curated block palette, and every block title is prefixed "AIEO" so they're searchable; product-context blocks stay scoped to product templates.
- Refinements & runtime. Retired a legacy product-labels stylesheet that was no longer needed (clearing a 404/MIME response). The thin front-end runtime plugin moves to its own 1.0 version and now also serves the SEO head, sitemap and redirects when the core plugin is trimmed from a request.
7.2 - 2026-06-09
TikTok conversions, consent carried on every event, runtime-owned measurement, in-request event delivery — plus the searchable ROI Wizard & new UTM Explorer with period comparison
- TikTok added to Pixels & Conversions. Browser TikTok Pixel + server-side Events API (deduplicated, ttclid recovered, consent-gated) — TikTok joins Meta and Google as a fully-owned platform.
- Consent on every event. Region-aware Consent Mode v2 defaults plus per-event consent on the server senders (GA4 MP, Google Ads, Meta CAPI Data Processing Options), so a declined category down-scopes the conversion at the ad platform too, not just the browser.
- Runtime owns measurement. With the runtime active it serves all three browser pixels and the three server senders itself (even when core is trimmed); core stays fully standalone.
- Event delivery rebuilt. Server conversions flush the page first (fastcgi_finish_request) and send in-request instead of via Action Scheduler — zero checkout latency, cron-independent. A "Fire-and-forget" toggle (on by default) frees the worker instantly; turn it off to log each reply.
- Order origin in staff e-mails. New-order notifications show the marketplace or the site channel/campaign, from the canonical order-facts source.
- Ad-connector setup links. Direct links to where each Google / Meta / TikTok credential is found.
- UTM Explorer (new). A cascading drill-down across the five campaign tags — Source → Medium → Campaign → Term → Content — each a searchable multi-select that narrows the next to what actually co-occurred. It lives on the ROI Wizard page and is findable from the admin command palette (search "utm"). The table splits the current selection down by the next level, with orders, revenue and average order value.
- Searchable multi-select across the whole cockpit. Every selector in the ROI Wizard and UTM Explorer — the Type, the exact detected value, the five UTM levels and the ad-spend ledger value — now uses the same fast searchable picker as product selection (search, tick several, Done), so choosing from hundreds of creatives or campaigns takes seconds. Type accepts several types at once and stacks one results table per type; Exact spans the union of the chosen dimensions' values.
- Reco lift per channel. A new ROI type showing the recommendation engine's incremental orders and € over and above each traffic channel — of the orders Google / Meta / organic brought, what share the recommendations assisted and what they added.
- Period comparison (both reports). Compare any result against the previous period or the same period last year, with a green / red Δ% inline on every metric. Off by default.
- Report polish. UTM consolidated onto the ROI Wizard page (ROI → UTM → ledger); From / To dates lead each row; top-aligned controls so selecting a value no longer nudges them; the Ad-spend connectors moved into a renamed "Tools & Settings" group; the default range is the last 30 days.
7.1 - 2026-06-08
First-party measurement & consent (server-side Facebook Pixel/CAPI + GA4, checkout active/idle timing, a lightweight Consent/GDPR cookie banner) — plus the new ROI Wizard & ad-spend connectors (Google · Meta · TikTok), one canonical order revenue/channel, Custom Tabs and drag-and-drop Product Tab Ordering
- Pixels & Conversions (server-side measurement). AIEO can now own the Facebook (Meta) Pixel and Google Analytics 4 end to end — a thin browser pixel and server-side Conversions API / GA4 Measurement Protocol, deduplicated on a shared event id, sent after the order is saved (zero checkout latency). Each platform is selectable (AIEO owns it, or stay out of the way for a tool you already run), with master off-switches so you can keep PixelYourSite. Facebook credentials can be read from PixelYourSite if present.
- Advertiser-grade match quality (PixelYourSite-Pro parity). The data your ad partners receive is now on par with a premium pixel plugin: Facebook browser Advanced Matching (the shopper's identifiers attached to the browser pixel, hashed client-side, consent-gated) on top of the existing full server-side set; complete GA4 user-data (name + address, not just email/phone, Unicode-correct for Greek); a built-in Google tag loader (load
gtag.js — or a Google Tag Manager container — directly from AIEO, wired to Consent Mode v2, so you don't need Site Kit); and Google Ads conversions with Enhanced Conversions, both in the browser (gtag user-data) and server-side via the Google Ads API (keyed on the captured gclid, resilient to ad-blockers). All of it rides the first-party consent gate.
- Consent / GDPR — first-party CMP. A lightweight, first-party cookie-consent banner (no external CMP, no IAB TCF bloat) on its own page: a rich-text message, three actions (Accept all / Decline / Customize) with a per-category preferences panel (necessary / functional / analytics / marketing), per-button colour theming (background / text / border + hover, with an equal-prominence guard so Decline can't be hidden), two layouts (bottom bar or a centre glass pop-up), a floating “Cookie settings” button so visitors can change or withdraw consent, and a policy-version field that re-asks everyone after a policy change. It drives Google Consent Mode v2 and gates AIEO analytics plus the Facebook / GA4 senders. A built-in cookie scanner classifies the cookies and third-party services your storefront sets (Google Fonts, GA4, the Meta pixel, YouTube, …) against a curated database — populated automatically as visitors browse (no server crawl, names only, never values) — with an inventory you can re-classify.
- Checkout timing. Active vs idle time is now measured for each successful checkout and aggregated per product, so offer timing (exit-intent, etc.) can be set from real deliberation data rather than a static delay; coupon-completed orders are tagged and excludable from the baseline.
- Custom Tabs (Product Display). Up to five extra product tabs you can switch on and rename at will (e.g. "Application", "Ingredients") — each holds its own rich text per product and the tab simply disappears when a product has no content for it. A one-click migration assistant imports existing content from the legacy Pods "usage" / "specification" fields (auto-enabling and labelling the first two tabs), and the legacy theme tabs are removed automatically so nothing shows twice.
- Product Tab Ordering. A new drag-and-drop card on the Product Display dashboard (between the info-column layout and the recommendations order) sets the order of the WooCommerce tabs (Description / Additional information / Reviews) together with your Custom Tabs, in one sequence; tabs a product doesn't have are skipped while the order holds for the rest, on both block (FSE) and classic themes.
- ROI Wizard — one cockpit for "what actually drove the sale". A new Attribution → ROI Wizard: pick a type (⭐ Recommendation engine, Offer, Channel, Campaign, Creative), the exact detected value, and a period — and see orders, revenue, cost, net, ROAS and ROI %. AIEO's own contribution is front and centre: recommendation-assisted sales and offer effectiveness (free shipping, gifts, discounts) sit next to marketing channels and campaigns. Revenue is the order AIEO computes; offers carry their real cost automatically (free-shipping uses the courier rate already computed in Fulfillment), and channels/campaigns use the ad spend you enter or sync.
- Ad-spend ledger + bulk CSV. A per-period, per-dimension ad-spend ledger backs channel / campaign / creative ROI — enter spend inline, or export a CSV, fill a whole quarter in a spreadsheet, and re-import. Manual entry, CSV and the connectors all land in one place.
- Ad-spend connectors — Google Ads, Meta, TikTok. Connect each platform once through a guided credential wizard (with exactly what to ask your ad agency for); AIEO pulls campaign spend nightly into the ledger so ROI becomes automatic — one cockpit for spend and your own recommendation / offer / channel attribution. Credentials are stored encrypted; the pull is read-only.
- One canonical order revenue + channel. A single source of truth for each order's revenue and marketing channel, reading from the order AIEO computes, with a documented map of where every order fact lives (including why the WooCommerce total and the ERP invoice total are intentionally different). The offer-effectiveness report now reads the canonical channel, so per-channel offer ROI now attributes orders correctly instead of leaving them "unattributed".
- Accurate engagement & attribution. The engagement score is now one canonical formula everywhere; re-delivered tracking beacons now count each add-to-cart total once; the Attribution dashboard's channel back-fill moved off the page render to an hourly background job, and its channel cards use one consistent 7-day window.
- Storefront & block editor. Carousels gained an optional "Recos carousel" slider style (pink scroll-progress bar) selectable per block; the Google Reviews block gained a manual swipe-scroll mode; and a WordPress-7 block-editor registration mismatch on AIEO blocks ("Invalid parameter(s): attributes") was resolved by registering the shared responsive / section-header attributes server-side.
7.0 - 2026-06-05
Product-page layout builder (block + classic themes), a reusable product/variation picker, and a master Button Styles control — plus side-cart mobile-bar styling (glass, per-icon, bubble), padding/min-max/glass for the master buttons, wishlist & brand in the layout builder, and sticky admin navigation
- Side-cart mobile bottom bar. Theme-independent colours (bar background + height, icon, cart-count number + circle), a glass effect (transparent + backdrop blur), per-option "selected" colours for Navigator / Search / AI Chat / Cart, an optional cart-only floating bubble (like the desktop cart), and refined alignment for the lone-cart badge. The whole side-cart surface also moved to a shared class so the runtime can render it without the admin plugin.
- Product Needs — Pills. New tag-style "pills" display alongside the list, with full pill styling (size, radius, padding, gap, colours, border).
- Master Button Styles — padding, sizing, glass. Per-group Top/Right/Bottom/Left text padding, min/max width + height, an opt-in glass effect, and full Secondary hover (border + hover background / text / border).
- Layout builder — Wishlist + Brand. "Add to Wishlist" is now placeable (Beside image / Beside the product title / Under image), and Brand Display gained the "Beside the product title" option; the builder wins over the per-module Brand position.
- Admin polish. Refined the toolbar icon layout; reordered the AI Optimizer submenu (Data Prep → e-shop Manager → AI Chat → Interactivity (IAPI) → Rec Cache) and removed the Session Schema Migrator from the menu; the top bar + e-shop Manager sub-tab navigation are now sticky.
- Product-page layout builder. One drag-and-drop "Display Order" list (Storefront Display → Single Product Page) now sets the vertical order of the whole product info column — the core elements (title, rating, short description, sale / free-shipping messages, price, add-to-cart) and the info modules (meta, categories, brand, payment logos, trust badges, waitlist, gifts, complementary, product needs, role-pricing login) — with a per-module "Beside image / Under image" choice. The same order is applied on both block (FSE) themes and classic themes (Botiga / FemmeFatale), so the page looks the same either way. Core blocks that ignore styling and the Brand Display placement now follow the list too.
- Categories line restored. The clickable "ΚΑΤΗΓΟΡΙΕΣ" comma-list is back as its own positionable module, styled to match the SKU/Barcode rows; the role-pricing login message is positionable too; and Product Categories now sits next to Product Meta in the menu.
- Reusable product / variation picker. A modal browser — pick simple products, whole variable products, or specific variations — replaces the free-text ID/SKU boxes on Product discounts, Free gifts and Free shipping (included and excluded lists), the Product Exchanger and the marketplace feed exporter. Existing selections migrate automatically.
- Master Button Styles (Tools). One place sets the default background, text, border and radius (plus hover) for every AIEO storefront button, with separate Primary, Secondary and Archive masters; per-button colour pickers (Waitlist, Complementary, Sticky Add-to-Cart, Side-Cart) inherit the master and override only when set. The side-cart, save/share-cart, coupon-apply and multi-select buttons now follow the master, and the admin colour-picker swatches now render reliably.
- Admin discoverability. The Ctrl / ⌘-K navigator indexes the layout card and the Saved & Abandoned Carts report; the AI Insights chat gained an abandoned-carts playbook and feature-location pointers.
- Auto-restock. The e-shop's own sales (a distinct ERP invoice type) are excluded from physical-store demand so restocks stay accurate; out-of-stock cancellations now surface in the Stock Recovery Unsuccessful-Restocks KPI.
6.5 - 2026-06-03
Stock Recovery basket-turnover halo + per-branch pickers, Missing Hot Sellers published-benefit accounting, and ERP de-duplication
- Stock Recovery basket-turnover halo: a new column plus a "Basket turnover protected" KPI show the total value of the whole in-store orders each out-of-stock product appears in (not just its own line) — the real basket revenue you defend by keeping the product available, captured at restock and summed across all restocks.
- Per-branch pickers + money-first sort: every Stock Recovery row lists units sold per physical store within the chosen window (so pickers know which branch holds the stock), and the queue is sorted by in-store turnover by default.
- Missing Hot Sellers per-branch column showing which stores sell each not-yet-published SKU.
- Missing Hot Sellers "Published from this list" accounting: once you publish a product from the list, its real online sales since publishing are tracked and summarised (products published, online units/turnover, vs the in-store demand it had) — quantifying the payoff of acting on the list.
- ERP de-duplication: the store-orders feed re-appends every order on each sync, inflating in-store turnover/unit figures; detection now keeps only the latest import-day per order (preserving genuine multi-unit purchases), so the numbers are accurate.
- Recency window can now be set up to 365 days (was 180).
6.4 - 2026-06-02
Missing Hot Sellers, variation descriptions on swatches, and clean activation on a fresh database
- Missing Hot Sellers now lets you control what counts as a "gap" so the totals reflect real opportunities. An Include filter chooses which statuses appear — by default drafts to complete and products not in the eshop at all, while Private (one-time/reciprocal offers you deliberately took offline) and Pending are excluded. The headline count, in-store turnover and estimated recoverable figure all follow the filter.
- New exclude-by-pattern field: list name or SKU substrings (e.g. recurring offers, coupons, gift vouchers, catch-all accounting SKUs like "ΔΙΑΦΟΡΑ ΕΙΔΗ") and any matching product is dropped from the list and the totals — for current and future imports.
- The per-row Dismiss still removes a single SKU permanently; dismissed items now appear in a manage list with a Restore link, so exclusions are no longer one-way. All filtering happens at read-time (no re-detection needed).
- Product swatches now surface each variation's own description. The per-variation description (e.g. "No100 Fair") is combined with its attribute into a "description - attribute" caption (e.g. "No100 Fair - Ανοιχτόχρωμο") shown when you hover an image swatch, under the product title on selection, and — alongside the attribute — in the cart, checkout, order details and emails. The swatch caption is read instantly from the preloaded swatch cache, so it costs nothing at render time; a "Variation name under product title" toggle was added to the Product Swatches settings, and the cart/order label is filterable (
aieo_dmm_swatch_cart_desc_label).
- Cleared the PHP notices emitted on first activation against a fresh database —
Undefined array key "index_type" / "index_name" / "index_columns" / "column_name" from wp-admin/includes/upgrade.php, followed by Cannot modify header information - headers already sent (the notice output had interrupted the post-activation redirect). WordPress's dbDelta() parses CREATE TABLE line by line and mis-reads blank lines (as empty indexes) and -- SQL comments (as columns) once PHP 8 surfaces undefined-array-key notices. A new aieo_dbdelta() wrapper strips blank/comment lines before table creation, so our documented schema SQL stays readable while dbDelta receives one field/index per line. Affected the Customer Surveys and Push customer-intelligence schemas; observed on a fresh MySQL 8.4 install.
6.3 - 2026-06-02
Paid-traffic attribution (Facebook + TikTok + Google), offer-targeting correctness, catalogue-query hardening
- Attribution: full paid-social support. The session attribution now captures the raw click id (fbclid / ttclid / gclid / gbraid / msclkid / …) for Conversions-API & offline-conversion uploads, plus the campaign -> ad set / ad group -> ad hierarchy (Meta
ad_id / adset_id / campaign_id, TikTok and Google adgroup_id), so paid campaigns can be analysed down to the ad. TikTok and Google iOS (gbraid / wbraid) clicks are now classified correctly, and Instagram link shares stay "social" (not mis-tagged as paid).
- Product discounts / Free gifts / Free shipping — targeting correctness:
- Exclusions now work as a cart-level veto: when the cart contains any excluded brand / category / need / product, the discount, gift or free-shipping rule no longer applies (as the UI states).
- The "Specific products" whitelist is now enforced — an offer that requires one of those products only applies when the cart actually contains one.
- Per-product discounts now honour the exclusion lists, and cart-conditional discounts (minimum subtotal / specific-products) no longer apply unconditionally.
- Corrected discount application so the percentage now applies once per cart line when "apply discount to the main product price" was enabled (previously it could apply twice).
- Free-gift awards now respect exclusions and the specific-products whitelist.
- Corrected brand-only discounts so they now attribute to the right line in the offer ROI reports (previously spread across every line).
- Duplicate-promo detection now considers every condition (exclusions, thresholds, scopes, specific-products) so distinct promos are no longer dropped as "duplicates"; gift offers are now de-duplicated on save to prevent accidental gift stacking.
- Performance: product targeting lookups are memoised within a request (fewer repeated taxonomy reads during cart and shipping calculation).
- Hardening: the gift "sample" hiding on shop / search pages no longer issues an expensive postmeta self-join on every archive query (it could pin the database for minutes on large catalogues) — sample products are now excluded via a cached id list.
- Stock Recovery: in-store demand is now shown for both the recency window (which drives the suggested restock quantity) and all-time since the product went out of stock, clearly labelled on the headline totals and each row — so the figures match the suggestion.
- New: Multi-Attribute Variations tool (Catalog Sync → Stock Management) — lists variable products that use more than one attribute for variations (e.g. colour × size). Allowed by default (a master switch lets you turn on a save-guard that blocks them in catalogues where it's a mistake).
6.2 - 2026-06-01
Flat-vitals data sourcing, schedulable predictor, recovery insights
- SKU and barcode (GTIN) indices are now precomputed into the core product vitals table on every build — rolled up per parent in the variation-combine step — and a
parent_id index was added. SKU/barcode lookups now read a single flat vitals row instead of joining the legacy Pods table.
- Sales / out-of-stock predictor: the staged (batched) build now also runs on the scheduled path, so the predictor can be put on a schedule (WP-Cron / system cron) without the parent-grain pass stalling — previously only the manual "Run now" used batches.
- Stock Recovery: new headline card totalling the in-store sales of products the eshop currently has out of stock, alongside the predictor's pessimistic / average / optimistic recovery-value estimates.
- Missing Hot Sellers: new card totalling the in-store sales currently missing online (products, units, turnover).
- Stock Recovery confidence thresholds each get a plain-language hover tooltip explaining the setting and how to tune it.
- Performance: bulk COGS apply now suppresses heavy per-save reindex hooks (search / filtering / feeds / embeddings) for the duration of the run, so large catalogues update in a fraction of the time.
- Refined: the full bundled translation is no longer shadowed by an incomplete wp.org language pack (e.g. a 10-string Greek pack) that could leave most of the admin UI in English. The plugin now forces its bundled translation to take precedence over an incomplete global language pack.
6.1 - 2026-05-31
- Physical-Demand Recovery: detects products the ERP marks out-of-stock that the physical stores still sell, and can auto-restock them (manager confidence thresholds) — with recovered-sales (units + €) and success/outcome tracking.
- Missing Hot Sellers: ranked list of SKUs selling in-store but not live in the eshop (draft imports needing images/description/categories/brand, or absent), with direct edit links.
- Catalog Sync reorganised into a two-column panel (Stock Management / Sync & Feeds).
- Sales/out-of-stock predictor now runs from the UI in batches (no timeout); grain/anchor controls realigned.
- All Insights reports (wpDataTables) re-pointed to the AIEO schema; two new Insights-chat skills for the data above.
- Resolved a harmless "Duplicate column name 'entry_source'" notice on deactivate/reactivate.
6.0 - 2026-05-29
Block-checkout COD gating suite, BoxNow Partner API, payment-method reactivity
- NEW: Cash-on-Delivery can be disabled per destination country. A multiselect in the COD card (Free Shipping tab) hides COD for the chosen billing countries, driven by the checkout country switcher — flip to Cyprus and COD disappears live; Greece keeps it. Works on both classic and block (Store API) checkout via a runtime delegate plus a
canMakePayment block callback that updates reactively on every country/shipping change, no reload
- NEW: COD can be disabled per shipping method / courier (e.g. tick "Box Now" to forbid COD whenever Box Now is selected). Table-rate rate IDs are normalised (the
_rule_{id} suffix stripped) before matching so every carrier resolves correctly
- NEW: per-courier COD fee override with a
{cod_fee} placeholder in the gateway description that resolves to the courier-specific amount. Decimal entry accepts both . and ,
- Performance: the entire gating layer only registers its filters / block JS when a country, courier, or fee override is actually configured — stores on plain default COD pay no runtime cost
- NEW: Payment Gating (cheque-on-pickup) now works on block checkout and lives under the COD card on the Free Shipping tab (its standalone tab is removed). Runtime delegate added so the Store API path honours it
- NEW: BoxNow Partner API driver — full integration (manual v7.2). OAuth2 client_credentials auth, create voucher, label PDF, cancel, and locker listing; the order-edit Print action now appears for BoxNow vouchers. Verified create → label → cancel on production. Credentials live in
courier_boxnow settings; build_voucher_payload() now passes order_id so the driver can read the customer's chosen locker
- NEW: Skroutz / Shopflix feeds emit
color + additional_image for the "Μόδα" (fashion) category, sourced from core product vitals. Skroutz wraps colour in CDATA and emits <color/> when empty so the field is present on every product
- Refined: checkout landing message now spans the content width (carries the theme
alignwide class) so it lines up with the checkout/cart rows below
- Improved: chat model selection now saves newly released models (e.g. Claude Opus 4.8) — the Save handler validates against the model registry instead of a hardcoded whitelist that silently reverted the choice
- Hardened: the chat-model save path no longer hits an
array_map() fatal, plus four more (array) sanitize_text_field($_POST[...]) array-swallowing anti-patterns corrected (embedding manager, ratings, TRS zone admin, DMM social login)
- Removed: the deprecated legacy shipment-tracking module (AIEO Fulfillment tracking supersedes it; orphaned option cleaned up)
5.10 - 2026-05-28
Shopflix voucher endpoint correction + admin list-table per-page caps
- Corrected: Shopflix voucher PDFs now come back with the right layout/rotation. The print endpoint expects
/shipments/{trackingNumber}/print, not /shipments/{orderId}/print — Shopflix support confirmed 2026-05-28. We now capture trackingNumber from the create response (with a /orders/{id} fallback for already-existing shipments) and call print correctly. Vouchers now respect the merchant-portal-selected label format
- NEW: admin list-table per-page caps. Tools tab → "Admin list-table per-page caps" card sets a hard ceiling on Screen Options for the All Orders + All Products lists (defaults 200/200). Operators below the cap keep their personal value untouched; only those above (e.g. shop managers running at 500–600) get clamped on the next render. Settings are administrator-only — shop managers see the card but it's overlaid with a frosted "Administrator only" lock. Cap=0 disables enforcement for that screen
5.9 - 2026-05-28
AS async runner restored, admin-bar menu, Shopflix message decoder, re-ship of ACS driver
- Critical update: ensures the ACS Courier driver improvements actually ship. The 5.8 wp.org package was built from a snapshot that predated the ACS driver rewrite, so sites updating from 5.8 didn't receive the 10 improvements documented in the 5.8 changelog. 5.9 re-bundles them properly. If you're on 5.8 and your ACS vouchers were still mis-printing (Weight: 5,00, COD: 602,00), update to 5.9
- NEW: Action Scheduler async runner re-enabled. Pending actions now drain continuously instead of waiting for the 5-minute system-cron window. AS's own background AJAX runner is allowed to fire on every page load; regular page rendering stays unaffected (concurrent_batches=0 on web). One prod site went from 150 overdue actions to 81 in under a minute after the update
- NEW: admin-bar menu. The "AI Optimizer" icon appears in the WordPress admin toolbar with dropdown shortcuts to Data Prep, e-shop Manager, and AI Chat. Saves the operator a sidebar-scroll on every screen
- Improved: Shopflix accept messages are now human-readable. The Shopflix API returns its messages under
error.message + error.code, and the parser now reads those directly instead of error.errorMessage (which had fallen back to "HTTP 400"). Now surfaces the actual message ("Cannot Accept Order (10303)" etc.) so operators know whether to retry, contact Shopflix support, or skip the order
5.8 - 2026-05-24 to 2026-05-26
Three-day stretch — COD surcharge refinement, Skroutz webhook repair, ACS Courier driver rewrite, AS dedup hardening, fulfillment polish
- Corrected: the COD payment method now stays available at checkout even when the cart uses a non-whitelisted shipping slug. AIEO force-restores the configured COD gateway, pre-empting WC's "Enable for shipping methods" whitelist and any third-party filter (Box Now, COD-Plus). Runtime + admin both updated
- Refined: COD fee now overwrites a same-label legacy fee instead of skipping via idempotency. Operator-set €X is authoritative
- Marketplace Order Importer — Skroutz webhook integration repaired end-to-end: parser accepts both wrapped
{event_type, order:{…}} and flat {event_type, id, code, …} payload shapes; falls back to order.code when Skroutz omits the numeric id; uses Skroutz's current line-item field names (product_name / unit_price / total_price); Mapper survives orphaned product references via try/catch + free-form line-item fallback
- NEW:
REGISTERED state added to the MOI Accept/Reject button allowlist so Shopflix orders in their initial state actually show the action buttons
- ACS Courier driver — ten refinements audited against the official ACS Rest API docs: response envelope preserved (so
ACSExecution_HasError + per-row Error_Message reach the UI); response traversal corrected to ACSOutputResponce.ACSValueOutput; address split into street + number; Greek phone landline/cell split with +30 stripping; Charge_Type defaults to 2, auto-switches to 4 when COD; Acs_Delivery_Products auto-appends COD when cod_amount > 0; print uses the correct ACS_Print_Voucher alias and decodes the base64 PDF; cancel uses the correct ACS_Delete_Voucher alias; Weight + Cod_Ammount now sent as JSON numbers (was being parsed by ACS with Greek locale, multiplying decimals by 10 on the printed label)
- NEW: Recompute queue — atomic dedup at the AS schedule layer. New
pre_as_schedule_* filters with MySQL GET_LOCK short-circuit as_schedule_* calls when a pending/in-progress action exists. Closes the dedup-bypass that let parallel recurring chains accumulate (one prod site had 225 pending ticks for a single hook before this change)
- Hardened: Session Tracker
trackAddToCart now guards $button.* access and falls back to page context when callers fire added_to_cart without the 4th $button arg. Resolves the spinner-stuck symptom on the swatches bulk-add path
- NEW: Fulfillment vouchers —
postal_code column stored at voucher creation. Migration is idempotent and runs on plugin upgrade
- Improved: Stock import now strips the UTF-8 BOM, transcodes Windows-1253 / ISO-8859-7 → UTF-8, and synthesises a header row when the first line is data. Greek-locale Excel exports import without manual conversion
- NEW: Price export — Stock column + Vitals fast-path. Reading from the vitals cache turns a 90-minute export on a 25k-SKU catalogue into about 2 minutes; Live path unchanged
- Marketplace feeds — field parity with the wpwoof reference + universal
?cf-no-cache=1 cache-bust on every emitted URL. g:price now emits the regular price correctly (it had previously emitted the sale price)
- NEW: Geniki monthly invoice CSV reconciliation card on Fulfillment → Reports. Matches invoice rows to voucher rows; surfaces orphans either direction. Pattern is carrier-agnostic; Geniki is the first integrated
- Bulk fulfillment actions are now memory-protected. Lifts the practical limit from ~40 orders to 200–500+ depending on the carrier API
- Critical update: the WC 10.9 compat migration now completes cleanly instead of looping. Replaced the earlier "_product_image_gallery missing" gate with explicit
_aieo_variation_migrated markers (one prod site had run the loop 153,219 times across 2.5 days). New operator UI in DMM → Variations gallery exposes the migration state
- Refined: Variation image storage now uses a two-hop join via
_product_image_gallery (WC 10.9 canonical) → _thumbnail_id → parent featured. Resolves the "variation image renders as the 40×40 swatch chip" regression
- Refined: Star ratings mobile non-FSE alignment + caption wrap. Defeats Botiga's universal
button { min-width: ... } rule that pushed empty stars onto a second row
5.7 - 2026-05-24
Day-after follow-up to 5.6 — runtime-only brand blocks, engagement-gated Web Push, plus three small admin polish items
Web Push — engagement-gated banner (Chrome quiet-UI mitigation)
- NEW: the opt-in banner no longer mounts on a flat
setTimeout(SHOW_DELAY_MS). It now waits for AIEO Session Tracker to dispatch an aieo:engagement CustomEvent on document at one of these milestones: pageviews-2, pageviews-3, scroll-25, scroll-50, scroll-75, add-to-cart, time-30s. The "Show delay (ms)" admin setting becomes a minimum-wait floor (banner never appears before that even if scroll fires at 2s)
- NEW: hard-cap fallback at 90s — visitors who never hit a milestone but also don't bounce still see the banner eventually
- Graceful degradation: when AIEO Session Tracker is absent (operator disabled it OR runtime-only install without the admin asset), falls back to the original flat-timeout behavior so no install regresses
- Why this matters: Chrome's quieter notification permission UI auto-denies prompts on domains with low acceptance rates. Asking bounce visitors on first-page-load poisons the reputation — every silent auto-denial counts as a "Block" signal. By only prompting engaged visitors, the acceptance rate per prompt climbs and Chrome's quiet UI fires less aggressively over time
-
Engagement signal source:
AIEO_SESSION_TRACKER.pageViewsInSession (new public property, sessionStorage-backed, incremented eagerly even for bounce visitors so counts are accurate). New aieo:engagement CustomEvent is also dispatched from inside trackAddToCart and trackScrollDepth so other consumers can hook in too — no new tracker, just extends what's already there
Brand blocks now runtime-resolvable — admin plugin no longer required for storefront pages that render aieo/brand-*
-
NEW:
AIEO_Runtime_Brand_Blocks delegate in the runtime plugin registers the six brand-related server-rendered blocks (aieo/brand-azindex, brand-slider, brand-rails, brand-related, brand-archive-hero, brand-story) at init priority 29 so they're available even when the admin plugin isn't in the request's plugin whitelist. block.json + render.php files stay in the admin plugin's directory (single source of truth); AIEO_Core_Brand_Vitals autoloads via the mu-plugins autoloader regardless of admin being active
AIEO_Blocks_Loader::register_blocks() now consults WP_Block_Type_Registry::is_registered() before each register_block_type() call — when both plugins are active the runtime registration at init@29 wins, and admin's loop at init@30 silently skips already-registered blocks (no more _doing_it_wrong notices from duplicate registration)
- Shared style handle
aieo-article-cards (needed by brand-related) is also registered by the runtime delegate so brand-related renders correctly in runtime-only mode
-
Use case: pages with brand sliders / brand A-Z directory / related-brands rails on category, blog, and landing pages no longer require the full admin plugin on every request — same render output, ~40 ms saved per page on cold-cache fetches
Resolved — Session Tracker JS 404 + MIME-type refusal on every front-end page
-
Resolved:
aieo-session-tracker.js previously returned HTTP 404 with text/html body because the class was moved to the runtime plugin (Phase 1.5) but the JS asset was left behind in the admin plugin. plugin_dir_url(__FILE__) . '../assets/js/aieo-session-tracker.js' from the runtime class resolved to runtime/assets/js/aieo-session-tracker.js — which didn't exist. Browsers logged "Refused to execute script from ... because its MIME type ('text/html') is not executable" on every page load. The asset now ships alongside both plugin copies of the class so the runtime-first autoloader path finds its own asset
Critical update — Web Push: opt-in pipeline interrupted by deferred JS + Service-Worker 404 + silent localStorage throws
-
Resolved:
AIEO_DMM_Web_Push now registers rocket_delay_js_exclusions on activation so WP Rocket's "Delay JavaScript execution" feature stops treating aieo-push-optin, aieoPush, aieo-push-sw and aieo-magic-link-modal as deferred-until-interaction scripts. Without this, the opt-in banner JS only ran after a mouse-move / scroll / click that lands inside the page — bots, remote-desktop sessions, and visitors who follow a deep link straight to a product page never triggered it, so the subscribe POST never fired. Now Just Works on every install with no operator config
- Hardened:
aieo-push-optin.js now stays resilient on Edge's Tracking Prevention (and Safari ITP) when localStorage.getItem() throws — previously the unguarded call halted the entire IIFE before the banner could render. Now wrapped in try/catch; blocked storage is treated as "no cooldown set" so the banner still appears
- NEW: silent re-subscribe path — when
Notification.permission === 'granted' from a prior visit but no wp_aieo_push_subscriptions row exists (e.g. the earlier SW-404 edge case had stopped the original POST), the JS now silently registers the SW, calls pushManager.subscribe() and POSTs the result on page load. No banner re-prompt, no operator action — historical "granted but never recorded" users heal themselves on next visit
- Improved:
postSubscription() now checks response.ok and throws on non-2xx so the outer try/catch records the unsuccessful POST instead of fire-and-forget. CFG.debug-gated console output for the operator who wants to dig in
-
See docs/WEB_PUSH_INSTALL.md §4 for the Nginx
location = /aieo-push-sw.js block — the third leg of this trio (404 SW URL was the upstream root cause on the FF prod incident 2026-05-23)
Data Prep Schedule — product_attributes stage added so brand blocks self-populate without the manual rebuild
-
NEW: hourly data-prep cron now runs a
product_attributes stage between category_hierarchy and product_vitals. This stage calls the AIEO_InsertCoreProductAttributes stored procedure with the operator's configured brand / vendor / size / color attribute taxonomies — resolving parent brand_id from wp_term_relationships. The existing propagate_brand stage then copies parent → variations as before
- Why it matters: brand blocks (
aieo/brand-azindex, brand-slider, brand-rails, brand-related, brand-archive-hero, brand-story) used to render empty on sites where the operator hadn't ticked "Please recreate the product core attributes and principal categories" in the Operational Efficiency Settings UI. That checkbox is now correctly scoped as a manual intervention only — the hourly schedule covers the day-to-day case
-
Defensive: the new stage uses
information_schema.ROUTINES to verify the SP exists before CALLing it — older installs without the SP get a clean no-op instead of breaking the whole tick
Google Reviews — single-location auto-fallback + clearer empty states
-
NEW: when the
aieo/google-reviews block (or [aieo_google_reviews] shortcode) is in "Single location" mode but no slug is set AND the page can't auto-resolve a location from context, the block now falls back to the operator's only configured location if exactly one exists. Most SMB stores have a single physical shop — they no longer need to pick a slug for every block instance, the block just works
- Improved: the empty-state message now shows the actual number of locations configured and steers the operator to the right next step. "No Google Reviews locations configured yet — add one under..." (when 0 exist) vs "You have N locations configured — pick one via the block's sidebar, or switch to All-locations / Cards grid mode" (when 2+ exist). Replaces the old cryptic "Set a location slug, or place this block on a page bound to a location row"
-
The admin Settings tab now carries a full "How to display the reviews on the storefront" help card explaining the FSE block, the three shortcodes, all 11 attributes, and a
do_shortcode() PHP-template snippet — so operators on classic themes / page builders find the docs without leaving the admin
Google Reviews — shortcodes for non-FSE themes + runtime-only exposure
-
NEW:
[aieo_google_reviews] shortcode — wraps the same render path the aieo/google-reviews block uses, so classic themes / widget areas / page-builder pages can drop in Google Reviews without needing FSE block-template editing. Single-location mode when a location attribute is supplied ([aieo_google_reviews location="downtown"]), all-locations mixed-feed otherwise ([aieo_google_reviews]). All block attributes are exposed in snake_case: min_rating, max_count, layout (grid/list/carousel), presentation (static/slider/rotator), autoplay_sec, show_overall, show_rate_us, show_maps_button, heading, mode (single/all_mixed/cards_grid)
- NEW:
[aieo_google_locations_grid] shortcode — convenience alias forced to mode="cards_grid" for the per-location cards layout. Accepts the same attributes
- Single source of truth: both shortcodes call
AIEO_Google_Reviews_Block::render() directly, so the cache, the markup, and the CSS handle are identical to the block output — operators can mix-and-match blocks (FSE) and shortcodes (classic) on the same site without divergent rendering
-
NEW:
AIEO_Runtime_Google_Reviews delegate exposes the block + shortcodes to runtime-only contexts — admin's AIEO_DMM_Google_Reviews module is no longer required on the frontend. block class files stay in admin's includes/dmm/google-reviews/ (single source of truth); the mu-plugins autoloader resolves them on demand. The block class is now idempotent (AIEO_Google_Reviews_Block::register() guarded by a $registered flag) and admin's call is gated behind ! defined( 'AIEO_RUNTIME_OWNS_AJAX' ) so runtime is exclusive when both plugins are active. Same aieo/store-info block also exposed
Data Prep Schedule
-
NEW:
product_attributes stage runs hourly between category_hierarchy and product_vitals — calls AIEO_InsertCoreProductAttributes automatically so parent brand_id populates without ticking the manual "Recreate product core attributes" checkbox
-
NEW: per-stage Notes column in the Last-run table — shows useful metrics per stage (e.g. "4921 / 13513 with brand · 194 distinct brands")
Admin polish
-
Refined: Database Performance Optimization card no longer hardcodes "MariaDB 11.4+ detected!" / "MySQL 8.0+ detected!" — now interpolates the actual detected version from
aieo_check_mariadb_version() (e.g. "MariaDB 11.8.7 detected!"). Falls back to the prior threshold strings if version_number is somehow missing
- Refined: Google Reviews → Locations admin no longer uses Femme-Fatale-specific placeholder text (
piraeus slug, Femme Fatale Πειραιάς display name). All four placeholders are now generic + translatable (e.g. main-store, downtown, branch-2, Customer-facing label for this location, etc.) so the form isn't shipping client-branded examples
5.6 - 2026-05-23
Same-day follow-up to 5.5 — Fulfillment UX polish + two production updates + CSV round-trip cleanup
Production updates
- Hardened:
Undefined constant "AIEO_VERSION" fatal in AIEO_Wishlist::enqueue_assets() on category pages when AIEO Runtime loads before the main plugin's constant definition. Defensive defined() fallback chain in the runtime: AIEO_VERSION → AIEO_RUNTIME_VERSION → '0.0.0'. Same pattern for AIEO_FILE. Surfaced on prod femme-fatale.gr /me-ammonia/ as a site-wide HTTP 500 immediately after the 5.5 upgrade
-
Performance: new
AIEO_Perf::strip_aioseo_product_schema_on_archives() short-circuits AIOSEO Pro's Product / WooCommerceProduct / Offer / AggregateOffer schema graphs on archive and taxonomy pages. AIOSEO was iterating every product in the loop and calling $product->get_available_variations(), which on Iconic Variation Swatches triggers a $wpdb->get_results() per variation — ~900 queries per render on a 15-variable-product category. Single-product pages are unaffected (full JSON-LD still emitted where Google rich results actually matter). Prod render time on /me-ammonia/: 9.4s → 3.2s
Fulfillment — order-edit meta box
-
Refined: Add Voucher carrier dropdown now lists operator-enabled carriers + custom carriers only, instead of every registered carrier including disabled ones (matches the rest of the admin)
- Refined: pressing Enter in the tracking-number input previously submitted the order's outer form, navigating to the "Downloaded products" panel. The AIEO meta-box inputs now suppress Enter and trigger the explicit Save button instead
- Improved: ACS (and any carrier already mapped via
get_carrier_for_order()) is pre-selected when the modal opens, instead of defaulting to the alphabetical-first carrier
- Improved: button labels now reflect what will actually happen — "Save tracking" / "Generate voucher" by mode, with a paired "Save + mark completed" / "Generate voucher + mark completed" for the common single-click flow
-
Corrected: custom carriers with
create_mode = 'manual' (no API integration) no longer report "driver does not support create_voucher". The manual flow now persists the tracking number directly and fires the customer email, bypassing the driver call
Fulfillment — Carriers without API admin
-
NEW: inline Edit button next to Remove on every row — label and tracking-URL template editable in place; Save / Cancel pair posts to the same upsert AJAX endpoint
- Corrected: the
tracking_url_template field is now honoured by the courier-driver base when an operator overrides the per-carrier default. AIEO_Courier_Driver_Base::tracking_url() now consults the operator-saved template first
-
NEW: filter
aieo_custom_carriers — themes / plugins can register carriers from functions.php, same pattern as WooCommerce Shipment Tracking's wc_shipment_tracking_get_providers
Fulfillment — Settings
-
NEW: "Backfill customer shipping paid" card — one-shot retrospective pass that fills
_aieo_customer_shipping_paid on historical orders so the Shipment Cost reports' income column is populated for past periods (not only orders placed after the cost-tracking went live)
Shipment Cost reports
-
NEW: sortable column headers on the results table — click to sort by orders / income / our cost / free-shipping subsidy. In-memory client-side sort (the result set is already paginated server-side)
Role-based pricing — CSV round-trip
-
Improved: import now strips a leading UTF-8 BOM from the uploaded file before parsing (Excel-on-Windows exports leave one). This previously surfaced "must include sku column" messages when the actual header was
\xEF\xBB\xBFsku
- Improved: import auto-detects the separator (
, vs ; vs \t) by counting candidates in the first line. Greek-locale Excel exports use ;; the previous hardcoded , parser produced unparseable single-column rows
- Improved: import status messages now state the detected separator and the header row that was parsed, so operators can see exactly why their file was rejected
-
Refined: export no longer prepends a UTF-8 BOM. Cross-environment round-trips (export from one site, import into another) used to need the import to strip BOMs first; now the file is BOM-clean from the start, keeping
cat / awk / diff output untouched as well
Critical update — Social Login settings now persist correctly on every Save
-
Resolved:
AIEO_DMM_Social_Login::ajax_save_settings() previously used the sanitize_text_field( $array ) anti-pattern as the guard for both providers and intents POST arrays. sanitize_text_field() on an array returns '' (empty string), so is_array('') was always false — every Save click had silently written empty providers + every-intent-off, regardless of what the operator had ticked in the UI. Symptom: "I've enabled Google + Facebook for login / checkout but the buttons never render anywhere." The guard is now is_array($_POST['providers']) directly; per-field sanitization (sanitize_text_field, sanitize_key) still runs on each value. Operators with previously-wiped settings need to re-enter their config once
-
Same anti-pattern was caught in 3 other modules in 5.2 (see memory
wp_sanitize_text_field_array_antipattern); this one slipped through because the SSO admin tab is less frequently tested
Marketplace Order Importer — webhook setup guide + Rooster-derived tokens
-
NEW: per-vendor "Setup help" card on the AIEO MOI → Vendors tab. Surfaces the webhook URL prominently with a one-click Copy button and per-provider step-by-step instructions for where to paste it into the marketplace's merchant panel. For Skroutz: deep-links to the exact
merchants.skroutz.gr settings page, names the field operators need to find ("Webhook URL / Webhook παραγγελιών"), and reminds them to deactivate the legacy skroutz-marketplace-xml-for-woocommerce plugin once the new URL is saved. Poll-only providers (Shopflix, eMag) get the card skipped — nothing for the operator to do
- NEW: webhook tokens on freshly-created vendors are now derived from the operator's Rooster API key via
substr(hash('sha256', $rooster_key . '|moi-webhook|' . $vendor_slug), 0, 20). Each install gets a unique, stable, self-identifying webhook URL — and the URL is regenerable from the Rooster key alone, so losing the vendor row no longer means re-pasting random tokens into every marketplace panel. Hash, not substring, so the token never exposes any portion of the Rooster key. Falls back to a random token on standalone (non-Rooster) installs
- NEW: per-vendor "Use Rooster-derived token" button on the setup card lets operators migrate existing random tokens to the Rooster-derived value (a small "✓ Token derived from your Rooster API key" badge then appears under the URL). Skips gracefully when Rooster isn't connected
-
AIEO_MOI_Vendor_Manager::derive_webhook_token_from_rooster($slug) + rotate_webhook_token_from_rooster($id) are the new helpers; new optional contract method webhook_setup_steps($url) on providers drives the per-provider guidance (Skroutz ships it; absent on poll-only providers)
Product Display — classic-theme info-column ordering
-
Refined: the operator-saved Display Order for the info-column cluster (Product Meta / Payment Logos / Trust Badges / …) is now honored on classic themes too, not only FSE themes. On classic themes those modules were hardcoded to
woocommerce_single_product_summary priorities 30 / 35 / 40, so Product Meta always rendered last regardless of how the operator dragged the rows. New AIEO_DMM_Product_Display::reorder_classic_theme_cluster() re-prioritises the three callbacks into the 31–34 band per the saved order, mirroring the existing reorder_classic_theme_recos() pattern. Modules with independent slot logic on classic themes (Brand Display's position picker, Brand Gifts' pre-cart band, Complementary / Waitlist / Product Needs' add-to-cart-form positions) are intentionally left where they are
Deprecation
-
AIEO_DMM_Shipment_Tracking module renamed in the admin sidebar to "Shipment Tracking (legacy)" with a yellow deprecation banner. The new Fulfillment → Carriers system supersedes it end-to-end; the legacy module will be removed in a future release
5.5 - 2026-05-23
MAJOR RELEASE: WooCommerce 10.9 forward-compatibility + critical update for the silent variation-attribute wipe + unified third-party variation gallery filter
Critical update — variations now persist reliably on save (long-standing edge case)
- Resolved: products whose variation attribute is type
image or button no longer lose their is_variation declaration when the parent product is saved. The root cause: AIEO's image / button attribute types never registered an admin form-field renderer for their term multi-select. When WC's classic editor's product-save handler ran, attribute_values[] was empty in POST for those attribute rows, so WC's WC_Meta_Box_Product_Data::prepare_attributes() dropped them — wiping _product_attributes for the variation attribute on every product save
- Added: new public method
AIEO_DMM_Swatches::render_custom_attribute_terms_select() hooks woocommerce_product_option_terms for color/image/button types and emits the same wc-taxonomy-term-search multiselect WC uses for select-typed attributes. Future saves preserve _product_attributes correctly
-
Added: one-shot auto-repair for products already affected. On plugin update, reconstructs the missing variation-attribute declaration from each variation's
attribute_pa_* postmeta and re-attaches the term relationships to the parent. Skips products that reference deleted (orphan) taxonomies — those need manual re-mapping by the operator
WooCommerce 10.9 forward-compatibility — variation_gallery + wc-visual-attribute
-
NEW: declares compatibility with WC 10.9's experimental
variation_gallery feature via FeaturesUtil::declare_compatibility(). When merchants enable the toggle in Settings → Advanced → Features, AIEO's variation gallery data is already in WC's canonical postmetas — no migration window, stores stay intact
- NEW: declares compatibility with WC 10.9's experimental
wc-visual-attribute (Color swatches for attributes) feature
- Schema migration:
botiga_variation_gallery → _thumbnail_id + _product_image_gallery (CSV) + _wc_variation_gallery_legacy_fallback_disabled = yes sentinel on every variation. Video entries (uploaded video attachments + YouTube / Vimeo embed JSON) relocate to the AIEO sidecar _aieo_variation_gallery_videos with their original positions preserved for re-interleaving at render time
- Schema migration: term swatch metas
product_attribute_color / product_attribute_color_type / gradient + multiple sub-keys → WC canonical color term meta + AIEO sidecars (_aieo_swatch_color_type, _aieo_swatch_gradient, _aieo_swatch_multiple). Image-type swatches relocate product_attribute_image → _aieo_swatch_image_id. Legacy keys are preserved as read-fallback during the cutover window
- Schema migration: attribute taxonomies with
attribute_type = 'color' flip to wc-visual so WC's native chips, filter blocks, and the variation-selector inner block recognise them. Operator-opt-in: the flip only runs when WC's wc-visual-attribute feature is enabled
- Migration runs via Action Scheduler in 250-item batches; idempotent; also exposed as
wp aieo migrate wc-compat for manual / observable runs
-
When WC's
variation_gallery feature is enabled, AIEO unhooks \Automattic\WooCommerce\Internal\VariationGallery\ClassicVariationGalleryAdmin::render_variation_gallery_field so the admin shows AIEO's picker (which handles videos) instead of two competing pickers
New filter aieo_variation_gallery_image_ids — bridge for third-party storage
-
NEW: single public filter
apply_filters('aieo_variation_gallery_image_ids', $ids, $variation_id, $context). Third-party plugins / themes (Iconic Variations, the retired WooCommerce.com Additional Variation Images extension, custom themes) hook this filter from functions.php to tell AIEO where they store variation gallery image IDs. Return non-null array to short-circuit; return null to delegate to AIEO's canonical → legacy resolution
- NEW:
AIEO_DMM_Variations_Gallery::resolve_image_ids($vid, $ctx) — the single public reader every AIEO module calls. Replaces direct postmeta reads in: variation gallery admin picker, woocommerce_available_variation JS payload, aieo/product-variations-gallery block render, exchanger import/export, data-prep stage
$context values: 'admin', 'frontend', 'block_render', 'data_prep', 'serializer' — let third-party adapters apply different rules per caller
-
Documentation:
docs/FILTER_VARIATION_GALLERY_IMAGE_IDS.md with 4 worked examples (Iconic, Additional Variation Images, custom theme, context-aware) + performance + testing notes
Marketplace feeds gain variation gallery URLs
-
NEW:
vitals.image_gallery_urls (existing column, now populated) gets a fresh data-prep stage that walks _product_image_gallery for each row and emits a CSV of full-size URLs. Marketplace feeds (Google Shopping g:additional_image_link, Skroutz <additional_image>, Shopify images) now ship variation galleries without a separate API call
- SQL bulk-fill (canonical
_product_image_gallery first, legacy botiga_variation_gallery fallback) handles 20-image galleries via a chained SUBSTRING_INDEX walk; ~1s for 39k rows on the FF benchmarker
-
PHP post-pass applies the
aieo_variation_gallery_image_ids filter only when registered, so the typical store pays zero extra DB cost
Cart, sticky-add-to-cart, and product-card readers updated for the new sidecar metas
-
class-aieo-dmm-swatches-runtime.php::resolve_term_color_style() — read order is now AIEO sidecar (_aieo_swatch_color_type + _aieo_swatch_gradient / _aieo_swatch_multiple) → WC canonical color → legacy product_attribute_color*. Gradient and multiple-color swatches keep rendering as before; new term edits use canonical + sidecar without breaking legacy plugins that still read the old keys
class-aieo-dmm-swatches-runtime.php::resolve_term_image_src() — _aieo_swatch_image_id → product_attribute_image → new aieo_swatch_image_id_for_term filter for forward-compat when WC adds image swatches (currently WC10.9-dev ships color swatches only)
class-aieo-dmm-checkout-product-images.php — same sidecar → canonical → legacy chain when picking the cart-line variation thumbnail
class-aieo-dmm-sticky-atc.php — color, gradient, multiple-color, and image swatches all read through the new resolution chain. Sticky cart on PDP keeps rendering brand-specific image swatches identically pre- and post-migration
-
class-aieo-dmm-data-prep-scheduler.php — SQL for variation_swatch and image_url updated to two-pass (canonical preferred, legacy as WHERE NULL fill-in)
Custom carriers — inline Edit + new third-party filter
-
NEW: inline Edit button on every row in the "Carriers without API" admin table. Label and tracking-URL template become editable in place; Save / Cancel pair posts to the same
aieo_ff_save_custom_carrier AJAX endpoint (slug is the upsert key). The shipping-method-link dropdown keeps its own per-row autosave — Edit doesn't touch it
-
NEW: filter
aieo_custom_carriers lets themes / plugins register carriers from functions.php, mirroring WooCommerce Shipment Tracking's wc_shipment_tracking_get_providers pattern. Carriers added via filter appear identically to operator-added ones in the admin table, the order-row tracking dropdown, and customer emails. Operator overrides via save win on the next read (option-side wins because the upsert is final)
Exchanger (product import/export) writes WC canonical
-
class-aieo-exchanger-product-serializer.php — variation gallery export goes through resolve_image_ids(), so third-party filters and WC10.9 canonical reads both round-trip correctly
-
class-aieo-exchanger-product-importer.php — imported variation galleries now write to _thumbnail_id + _product_image_gallery + sentinel (drops the legacy botiga_variation_gallery write target). Existing exports stay readable
Attribute-type registration cleanup
-
available_attribute_types() — keeps AIEO-only image + button types always. Registers color only when WC's wc-visual substitute isn't already present in the filter chain (avoids two "Color" entries in the admin dropdown post-migration). Pre-migration / WC feature off, behavior is unchanged
Tested up to: WooCommerce 10.9-dev nightly, validated on the femme-fatale.gr benchmarker (39k vitals rows, 7,443 variations migrated, 6,789 with multi-image galleries). Legacy om-product-swatches v1.0.4 coexists cleanly — both plugins write their own keys on term save, no conflict
5.0 - 2026-05-15
MAJOR RELEASE: Insights Chat (Claude-powered), Joint Session × Attribution Analytics, Four-Layer Retention, and the Pro Tier
Insights Chat — Claude-powered, in-admin
- NEW: Tools → Insights Chat — ask your shop questions in plain language using the AI Chat Anthropic key you already have
- NEW: 33 purpose-built Claude data abilities (registered through the WordPress Abilities API)
- NEW: Categorized accordion suggestion chips across 11 question groups — Customers, Brand portfolio, Recommendation rails, Attribution & archives, Product needs audit, Star ratings, Content & blog, Cross-skill, Store analytics, Promotions / launches / sales, Newsletters & campaigns
- NEW: Tool-use loop with bidirectional Anthropic-safe tool naming
-
NEW: All chips and abilities respect manage_woocommerce capability
Session Tracker × Attribution Engine Integration
-
NEW: Cross-cuts engagement (session tracker) with conversion (attribution engine) via a shared aieo_session_id cookie
- NEW: Blog-post attribution — clicks from blog posts to products now carry source=blog_post + source_meta.post_id
- NEW: Engagement-bucket buy-probability — empirical P(cart-add) per (scroll-quartile, time-quartile, mouse-activity) bucket
- NEW: Abandoned-cart triage, cart-removal analysis, rating × conversion correlation, need × conversion correlation
- NEW: 11 new joint-analytics abilities backing the chat suggestion chips
-
Improved: Attribution Engine now respects Session Tracker's consent state (GDPR alignment)
Insights Remote DB Streaming + Four-Layer Retention
-
NEW: Insights Remote DB Settings tab — stream raw events to your own operator-owned MariaDB / MySQL via the existing ERP connection registry
- NEW: Configurable export frequency (15 min / hourly / daily) with per-table lag dashboard and dry-run "Test export"
- NEW: 5 pre-aggregated daily rollup tables so the chat abilities never hit raw event tables — millisecond responses regardless of history size
- NEW: aieo_aggregate_rollups nightly cron + unified aieo_archive_run weekly cron
- NEW: Tightened hot retention — 14 days (sessions), 30 days (reco events), 365 days (cart-adds)
- NEW: Local-purge failsafe — hot rows are NOT deleted until the remote-export bookkeeping confirms receipt
-
Improved: Net stable DB footprint ~1.1 GB year-over-year (was unbounded — projected 6-8 GB by year 2)
Star Ratings → SEO Schema Bridge
-
NEW: AggregateRating JSON-LD bridged into AIOSEO, Yoast, and RankMath via their schema filters
- NEW: Fallback head-injected JSON-LD when no SEO plugin is detected
-
NEW: Per-feature enable/disable toggle on the Star Ratings admin page
Floating Mini Side-Cart, Sticky ATC & Free-Shipping Bar
-
NEW: Two-column floating mini-cart — left: "You might like" recommendations, right: Shopping Bag / Recently Viewed tabs with the free-shipping progress bar right under the tab header
- NEW: 500 ms debounced quantity AJAX → 400-byte JSON → optimistic client-side recompute — qty changes feel instant, no full cart recalculation on the server
- NEW: Session-level HTML cache keyed by cart_hash (30 s TTL); WC fragments integration keeps every other widget in sync
- NEW: Side-cart recommendations sourced from the DMM product-bundle endpoint — same cached HTML powers the product page AND the mini-cart
- NEW: Sticky Add-to-Cart bar (DOM classes + JS global kept verbatim so existing CSS/JS bundles work without modification)
-
NEW: Free-Shipping admin — threshold + product / brand exclusions, with the package-rates filter that strips free shipping when any excluded item is in the cart
Pricing Engine — Role Pricing, Brand Discounts, Loyalty Classes
-
NEW: Per-role price overrides via CSV upload (staged batch validation → AJAX batches); mirrors into the legacy om-role-pricing table so existing storefront integrations keep working byte-for-byte
- NEW: Brand-level % discounts with optional start/end-date windows
- NEW: Loyalty class definitions + user assignments — applied in the global pricing recipe by AIEO_DMM_Pricing_Engine
-
NEW: Stacking recipe: Role Pricing → Brand Discount → Loyalty Class — each customer sees the strongest applicable price
Conversion Boosters — Brand Gifts & Exit Intent
-
NEW: Brand-based free-gift offers — gift (price = 0) auto-added when the cart subtotal of the offer's brand(s) crosses min_subtotal within the date window
- NEW: Configurable exit-intent modal — fires on cursor exit-intent after a warm-up delay; two HTML bodies (generic site-wide + upgraded checkout-specific); optional restriction to checkout-only or anonymous visitors; session-storage dismissal
-
NEW: Legacy
exit-intent-offer standalone plugin auto-imported on first read and deactivated — no manual migration
Marketplace Connectors & Shipping
-
NEW: Marketplace Order Importer — pulls Skroutz / e-shop / Amazon orders into WooCommerce as native orders so attribution, stock, customer profiles, and fulfillment stay unified. Per-vendor webhook URLs with rotatable tokens, configurable SKU strategy, default order status per vendor
- NEW: Streaming Marketplace Feeds generator — handles 35k-product catalogues without blowing memory; include/exclude rules by product or brand, XML or CSV output, per-feed cron registration on save
- NEW: Shipment Tracking provider list cleaned up — drops US/UK/Canada/Germany defaults, adds Greek + Cypriot carriers + Stoferno.gr
-
NEW: Smart Shipping Label — guests / postcode-less carts see "Carrier (Από €X.XX)" with the minimum rate so they know shipping isn't free without seeing a placeholder default. Free-shipping carts hide method prices and the generic "Free shipping" pseudo-method (customer still picks a real carrier, just with €0). Greek "184 53" postcodes auto-normalize to "18453"
Customer Intelligence + Web Push + Voice-of-Customer
-
NEW: wp_aieo_customer_intelligence — keyed by eponymous_id (AIEO's canonical customer identity), with secondary wp_user_id + source_table columns so anonymous → logged-in stitching has a single home
- NEW: Chunked recompute stored procedure over AIEO's pre-built snapshot tables — omnichannel customer view (eshop + in-store merged) is the source of truth
- NEW: Behavioural segments — Top customers, Lost cohort, Lookalikes, Abandoned-cart, reactivation
- NEW: Triggered web-push flows — welcome, reactivation, price-drop, back-in-stock — with full dispatch log + per-subscriber delivery + click attribution
- NEW: Customer Survey Intelligence — Gravity Forms 18 + 20 ingest (real-time hook + daily cron safety net + manual button), 7 high-signal metrics (NPS class, overall satisfaction, professional-verified, personal priorities, discovery channel, gift category preference, personal profile), composite voc_score (0-100)
- NEW: "Notify me when back in stock" Waitlist — out-of-stock product pages render the signup form, stock watcher emails subscribers when stock flips back; one-shot migration from the legacy PPE waitlist table
-
NEW: Wishlist analytics — read-only admin views: which products are most-wishlisted, which surfaces drive adds, which pages / categories convert to wishlist
Pro Tier — Frosted-Glass Overlays on 13 Admin Tabs
-
NEW: Apple-glass overlay with PRO badge, feature-specific title + description + bullets, and "Upgrade to Pro" CTA
- NEW: Pro-locked tabs — Attribution Dashboard, Advertising Campaigns, Web Push, Customer Intelligence Surveys, Insights Chat, Shipment Cost Reports, Insights Remote DB Settings, Action Scheduler Cleanup, ERP Bridge, ERP Database, Order Documents & Couriers, Marketplace Order Importer, Branch Stock Scanner, Order Cancellations
- Improved: Pro detection now honors BOTH paths — eshop-optimizer.com Pro membership OR a valid rooster.systems Content Connector API key (either is sufficient)
-
Improved: Locked tabs do not execute heavy queries or expose credentials for non-Pro operators
Attribution Menu Restructure
-
NEW: New top-level "Attribution" menu group containing the Dashboard and the Advertising Campaigns admin
- NEW: Campaigns auto-populate from utm_campaign — no manual correlation needed; new campaign slugs appear as auto_draft rows after the next dashboard load
-
Improved: Advertising Campaigns moved from Pricing & Offers into Attribution (same dropdown as the dashboard it shares data with)
Greek Translation Pass + i18n Hygiene
-
NEW: ~70 new Greek (el) translation strings covering Pro overlays, suggestion chips, and admin navigator labels
- Improved: All 11 admin-navigator group labels wrapped in __()
-
Improved: 117 i18n issues resolved across the plugin
Plugin-check & Security Hygiene
-
Improved: Plugin-check blocking-severity findings reduced from 132 to 0 (excluding the agreed-upon DB stored-procedure exceptions acknowledged by the WordPress.org plugin review team)
- Improved: All AJAX handlers routed through a centralised nonce verifier
-
Improved: Every new DB-touching ability has min/max input bounds and sanitize_key on all string keys
Architectural Improvements
-
NEW: Module V2 manifest pattern (data/admin/frontend/compute split scaffolding — opt-in per module migration)
- NEW: .distignore file at plugin root keeps internal docs, dev tooling, and the Claude Code skill pack out of the wp.org distribution package
-
NEW: docs/BUILD_AND_DISTRIBUTION.md documents the SVN deploy workflow
Operator Notes
-
On first activation of 5.0 the new aggregate rollup tables are created and the nightly aieo_aggregate_rollups cron begins back-filling history — expect 1-3 nightly runs before the chat abilities reach full historical coverage
- The 13 Pro-locked tabs are visible to free-tier operators with the frosted overlay; underlying database tables are still created so a later Pro upgrade has zero migration cost
- No customer-facing front-end changes — this is an admin-side and analytics-side release
4.2 - 2026-01-28
FEATURE UPDATE: Products for the Same Needs - Need-Based Recommendations
Products for the Same Needs
- NEW: Automatic product suggestions based on matching customer needs (pa_need attribute)
- NEW: Finds products sharing primary, secondary, or additional needs with the current product
- NEW: Rankings powered by pre-computed TotalItemSales from product catalogue for maximum performance
- NEW: Smart exclusion of existing upsells and cross-sells to prevent duplicate recommendations
- NEW: Stores up to 6 optimized suggestions per product in dedicated database table
- NEW: Display checkbox in Display Preferences: "Please display Products for the same needs"
- NEW: Generation checkbox in Operational Efficiency: "Please generate products with the same needs"
- NEW: Displays first on product pages (priority 10) before upsells, cross-sells, and related products
- NEW: Multi-tier caching support via AIEO Recommendations Cache (Object Cache + Database)
- NEW: Empty sections automatically hidden when no matching products exist
- Improved: Seamless integration with existing AJAX lazy loading infrastructure
-
Improved: Skeleton loading animation while fetching recommendations
Technical Details
-
NEW: wp_aieo_product_need_suggestions database table for persistent storage
- NEW: AI_eShop_Need_Suggestions class for generation logic
- NEW: same_needs added to cacheable recommendation types
- NEW: Generation runs as final step in Operational Efficiency batch processing
4.1 - 2025-12-06
FEATURE UPDATE: Advanced Analytics, Conversation Memory, Business Knowledge Base & Performance Optimizations
Advanced Statistics with Heatmap Drill-downs (Pro)
- NEW: Product category performance analytics with visual heatmap drill-downs
- NEW: Brand-level performance tracking with interactive heatmaps
- NEW: Click-to-drill functionality for exploring category and brand hierarchies
-
Improved: Visual analytics for understanding product performance patterns
Conversation Memory
-
NEW: AI chat now remembers previous questions within the same conversation
- NEW: Contextual follow-up responses that reference earlier discussion points
-
Improved: More natural conversational flow with memory of user preferences mentioned earlier
Business Information Knowledge Base
-
NEW: Site Identity configuration - define "What this site IS" and "What this site is NOT"
- NEW: Automatic WordPress tagline integration in AI context
- NEW: Prevents AI from misidentifying your business type (e.g., calling a clinic a "shop")
- NEW: Import existing page content as knowledge base entries (text-only, HTML stripped)
- NEW: WooCommerce Shipping Zones integration - automatically sync all shipping rates and locations
-
Improved: Zone-centric shipping data structure for accurate location-based queries
User Feedback System
-
NEW: Thumbs up/down rating for each AI response
- NEW: User feedback stored for continuous improvement analysis
-
NEW: Rating data helps identify areas for answer quality improvement
JavaScript Performance Optimizations
-
NEW: Lazy initialization for session tracker - only activates on user interaction (click, scroll, mouse move)
- NEW: Lazy initialization for floating chat widget - full initialization deferred until button click
- NEW: Conditional asset loading - chat CSS/JS only loads when floating chat is enabled or shortcode is present
- NEW: Vanilla JS trigger button display for faster rendering (no jQuery dependency for initial display)
- Improved: Eliminated ~4s page load delay from session tracker
-
Improved: Reduced page weight on pages without chat functionality
WooCommerce Table Rate Shipping Compatibility
-
NEW: Full compatibility with WooCommerce Table Rate Shipping plugin
- NEW: Automatic import of shipping zones, rates, and conditions
- NEW: Zone-centric data structure with all postal codes and shipping methods per zone
- NEW: AI can now accurately answer "How much is shipping to [postal code]?" questions
- Improved: Only active shipping methods are imported (inactive methods excluded)
4.0 - 2025-11-27
MAJOR UPDATE: Dynamic AI Model Support + Database Collation Refinements + Anonymous User Chat Logging
Dynamic AI Model Registry
- NEW: Dynamic model selection from database - over 50 AI model flavours now available
- NEW: All Anthropic Claude models (Claude 4, Opus 4.5, Sonnet 4.5, Haiku 4.5 and all versions)
- NEW: All OpenAI models (GPT-5.1, GPT-5, GPT-4, GPT-o1, GPT-3.5 and all variants)
- NEW: All embedding models (Voyage AI, OpenAI) dynamically loaded from wp_aieo_ai_models table
- NEW: Model dropdowns in admin panel now populate directly from database registry
-
Improved: Adding new AI models no longer requires code changes - just update the database
Database Collation Compatibility
-
Refined: Core product attributes table now uses the correct charset collation
- Refined: Core product vitals table now uses the correct charset collation
- Refined: Core variation vitals table now uses the correct charset collation
- Improved: All AIEO tables now consistently use utf8mb4_uca1400_ai_ci (or database default)
- Improved: Full compatibility with MariaDB 11.4, MariaDB 11.8, MySQL 5.7, and MySQL 9
-
Improved: Removed problematic BINARY comparison in stored procedures
Anonymous User Chat History
-
Improved: Chat exchange logging now works correctly for anonymous (non-logged-in) users
- Improved: Session tracking properly handles anonymous user conversations
-
Improved: Re-ranking system properly logs all chat exchanges regardless of user status
Translation Improvements
-
Refined: Frontend chatbox now correctly loads translations from plugin languages directory
- Tuned: Translation loading priority adjusted for earliest hook execution
-
Improved: Fallback translation loading from multiple locations
API Key Validation & Credit Check
-
NEW: "Validate API Keys & Check Credits" button to verify all configured API keys
- NEW: Detects exhausted credits and displays warning with direct links to billing dashboards
- NEW: Quick access to Anthropic, OpenAI, and Voyage AI billing management pages
-
NEW: Status indicators show Valid, Invalid, No Credits, or Not Configured for each provider
Database Optimization
-
NEW: Added 6 missing Graph UUID indexes for optimal export performance (20 indexes total, up from 13)
- NEW: Indexes for all 9 UUID columns used in graph frequency calculations
- NEW: Product stats filter index for faster aggregation queries
3.6 - 2025-11-13
MAJOR UPDATE: MySQL 8 Full Compatibility + Advanced Search Re-ranking + Embedding Reliability Detection
Advanced Search Re-ranking System
- NEW: Configurable re-ranking weights for hybrid search results - control the balance between semantic similarity and keyword matching
- NEW: Dedicated "Re-ranking Weights" configuration section in AI Chat settings with real-time preview
- NEW: Semantic similarity weight slider (0-100%) - adjust how much AI embeddings influence search results
- NEW: Keyword matching weight slider (0-100%) - adjust how much exact text matches influence results
- NEW: Automatic normalization - weights always sum to 100% for perfect score balancing
- NEW: Visual feedback showing current weight distribution with color-coded indicators
- NEW: Three preset configurations: Semantic-focused (70/30), Balanced (50/50), Keyword-focused (30/70)
- NEW: Database schema migration for re-ranking weights with default 50/50 balanced configuration
- Improved: Search results now combine embedding similarity scores with keyword match scores using configurable weights
- Improved: More relevant search results by allowing merchants to tune for their specific product catalog
-
Improved: Better handling of product variations vs parent products in search rankings
Embedding Reliability Detection & Monitoring
-
NEW: Comprehensive embedding-outcome tracking system for monitoring API reliability
- NEW: Real-time outcome statistics showing success rate, average latency, and a breakdown by response type
- NEW: Automatic retry logic with exponential backoff for transient API responses (rate limits, timeouts, network issues)
- NEW: Smart response categorization: Rate Limits, Timeouts, Network Issues, Invalid Input, and Unknown Responses
- NEW: Outcome trend analysis showing time-series data for the last 30 days
- NEW: Visual exception-rate graphs with color-coded severity indicators (green <1%, yellow 1-5%, red >5%)
- NEW: Detailed response logs with timestamps, response types, and affected content IDs
- NEW: Automatic recovery suggestions based on response patterns
- NEW: Database table wp_aieo_chat_embedding_failures for persistent outcome tracking
- NEW: Unsuccessful items automatically flagged for priority retry in next training batch
- Improved: Embedding training now shows detailed progress including retry attempts
- Improved: API quota management with intelligent retry delays (60s for rate limits, 30s for timeouts)
- Improved: Clearer status messages during training with actionable recommendations
- Refined: Embedding batch processing now handles partial responses gracefully
-
Refined: Training continues through single-item issues - proceeds with the remaining items
MySQL 8 & Database Compatibility (100% MySQL 8 Support)
-
NEW: Complete MySQL 8.0+ compatibility - plugin now works flawlessly on both MariaDB 11.4+ and MySQL 8.0+
- NEW: MySQL 8-specific database performance optimization with histogram statistics support
- NEW: Database Performance Optimization section now auto-detects MySQL 8 vs MariaDB and applies appropriate optimizations
- NEW: MySQL 8 histogram-based query planning for 20-30% faster customer and product statistics
- NEW: Descending indexes for MySQL 8 to optimize recent-order queries without reverse scans
- Resolved: DROP INDEX IF EXISTS syntax incompatibilities on MySQL 8 - now uses INFORMATION_SCHEMA checks (100% compatible)
- Resolved: CREATE OR REPLACE FUNCTION syntax incompatibilities - converted to MySQL 8 compatible drop-then-create pattern
- Refined: Binary logging privilege handling - graceful degradation when log_bin_trust_function_creators is disabled
- Refined: All 52+ MariaDB-specific syntax instances converted to cross-compatible code
- Improved: Stored functions now skip creation gracefully on MySQL 8 with binary logging restrictions
- Improved: Helper functions (aieo_drop_index_if_exists, aieo_drop_function_if_exists) for database compatibility
- Performance: Expected 38-48% improvement on MySQL 8 after applying database optimizations (5-6 minutes vs 9.5 minutes for 37K products)
-
Performance: 13 composite indexes + histogram statistics on 6 key columns for optimal query performance
Additional Improvements
-
Improved: Enhanced logging throughout embedding and search processes for better debugging
- Improved: More resilient exception handling and user feedback during AI Chat configuration
- Improved: Database query optimization for embedding statistics and search queries
- Improved: Code organization with separate MySQL 8 optimization file for maintainability
- Refined: Variation enrichment now properly handles missing parent product data
- Refined: Embedding statistics now accurately reflect training status across all content types
- Updated: Documentation with MySQL 8 compatibility notes and performance tuning recommendations
3.5.2 - 2025-11-07
- Refined: Welcome bubble positioning now follows floating widget position setting (bottom-left, bottom-center, bottom-right)
- Refined: Welcome bubble positioning respects mobile position setting independently
- Refined: Welcome bubble arrow positioning for all positions (left, center, right)
- Refined: Chat close button height override for themes with aggressive button styling
- Improved: Text domain loading for translations - now works on all WordPress versions for local development
- Chat Addon: Updated to version 3.5.2 with improved localization and UI refinements
3.5.1 - 2025-11-07
- Hardened: non-WooCommerce sites are now fully supported - AI Chat properly checks for WooCommerce before calling product-specific functions
- Chat Addon: Updated to version 3.5.1 with improved compatibility for standalone WordPress sites
3.5 - 2025-11-07
- NEW: Advanced Session Analytics Infrastructure - Track customer attention and engagement like orders with detailed journey analytics
- NEW: Position Analytics - Automatically identify landing pages, exit pages, and bounce events for instant engagement insights
- NEW: Attention Economics Metrics - Measure time-on-page, scroll depth, click counts, and product revisits (hesitation metric)
- NEW: Conversion Funnel Tracking - Monitor checkout step progression from cart to order completion with drop-off point identification
- NEW: Journey Sequencing - Track event order and product view patterns for understanding customer behavior paths
- NEW: Custom Class-Based Event Tracking - Define custom CSS selectors to track clicks on any element (buttons, swatches, divs, images, etc.)
- NEW: Click Event Throttling - Optional throttling to prevent database flooding while maintaining accurate click counts
- NEW: Cookie Consent Bypass Mode - Toggle GDPR consent requirement for immediate tracking or compliance-first approach
- IMPROVED: Product image click tracking with 5-second debounce to prevent duplicate lightbox events
- IMPROVED: Custom tracking rules take precedence over standard tracking so each event counts once
- IMPROVED: JavaScript code generation is "baked in" as inline scripts for better performance
- IMPROVED: Automatic version bumping with variable-length strings for aggressive cache busting
- NEW: Multi-Layer Cache Compatibility - Session tracker now fully compatible with Nginx, Varnish, REDIS, WP Rocket, and Cloudflare
- NEW: Session-to-Order Linkage - Connect customer browsing sessions directly to WooCommerce order completions
- Improved: Client-side session generation for cache-proof tracking across aggressive caching environments
- Improved: Enhanced migration system with comprehensive schema validation for all attention analytics columns
- Improved: Archive table management now transfers all 20 analytics fields during scheduled cleanup
- Improved: Database indexes optimized for attention analytics queries (7 new indexes for performance)
- Refined: Session schema migration now correctly detects missing attention analytics columns
- Refined: Clean installations now create complete analytics schema with all 20 columns from activation
3.4 - 2025-11-06
- NEW: Configurable batch size parameter for embedding training - merchants can now adjust batch size (1-999 items) to control training speed and API rate limits
- NEW: Dynamic embedding statistics for all post types - stats section now automatically displays all custom post types with published content (was previously limited to Products/Pages/Posts)
- Resolved: Voyage AI taxonomy embeddings batch processing - corrected the associative array key mapping that previously surfaced "Unknown API error" when processing categories and tags
- Improved: Unified batch processing implementation - both OpenAI and Voyage AI now use consistent associative array format for better code maintainability
- Chat Addon: Updated to version 3.4
3.3.3 - 2025-11-05
- NEW: Category-scoped AI Chat - Users can select specific product categories, post categories, or CPT taxonomies to focus chat responses
- NEW: Smart Category Auto-Selection - AI Chat automatically defaults to the top-level parent category of the current product/archive page (e.g., opens scoped to "Skincare" when viewing a product in "Skincare > Face Creams")
- NEW: Related Products Slider in Chat - Visual product recommendations displayed in elegant slider format within chat responses
- NEW: Product Needs Attribute System - Merchants can define customer needs that products fulfill (primary, secondary, and additional needs)
- NEW: Heavily Weighted Needs in Embeddings - Primary and secondary needs get maximum emphasis in AI embeddings for accurate need-based matching
- NEW: Select All/Deselect All buttons for data analysis checkboxes for easier workflow management
- Improved: Object cache performance optimizations for category lookups and data retrieval
- Improved: More customization options for chat appearance and behavior
- Improved: Category hierarchy now uses dedicated hierarchy table instead of WooCommerce taxonomies for consistent cross-post-type support
- Polished: Various minor styling refinements for better visual consistency across admin panels
- Chat Addon: Updated to version 3.3.3 with full category filtering and needs-based semantic search
3.3.2 - 2025-11-04
- Resolved: Embedding training duplicate product ID issue - eliminated infinite loops during batch processing in some prioritization options
- Refined: AI Chat warning modal persistence - now properly removes after data analysis completion
- Improved: Database query optimization - added DISTINCT/GROUP BY to all ID-returning queries for duplicate prevention
- Improved: Performance indexes added to embeddings table (lookup_idx, stats_idx) for 10-20x faster queries
- Improved: Object cache bypass during critical embedding storage operations to prevent interference
- Improved: Multi-layer duplicate protection using array_unique() at function entry/exit points
- Improved: Index existence checks now use static variables instead of transients (no wp_options writes)
- Improved: All 8 priority metrics now supported with optimized GROUP BY queries
- Chat Addon: Updated to version 1.1.1 with sessionStorage support for warning state persistence
3.3.1 - 2025-11-03
- Polished: Admin panel styling - cleaned up overlapping CSS rules and consolidated chat admin styles
- Refined: Reduced plugin description to under 150 characters for WordPress.org compliance
- Improved: Chat addon CSS version bumped to force cache refresh for style updates
3.3 - 2025-11-03
- NEW: Plugin now works standalone without WooCommerce - perfect for corporate sites and merchant information pages
- NEW: Intelligent menu placement - integrates with WooCommerce when available, standalone top-level menu otherwise
- NEW: Custom network icon for better visual identification in WordPress admin
- NEW: Customizable AI Chat input placeholder text in settings
- NEW: AI Chat tab warning now shows on hover for better user guidance
- Improved: Shortened menu labels ("AI Optimizer") to prevent UI wrapping on smaller screens
- Improved: Added descriptive submenu items with emoji icons for better navigation
- Improved: Updated to use future-proof Claude model alias (claude-sonnet-4-5)
- Improved: AI Chat warning only displays on WooCommerce sites (not needed for standalone content sites)
- Improved: AI Chat tab warning automatically refreshes after data analysis completes
- Refined: Chat wrapper now properly fills custom popup width without margins
- Refined: Send button arrow now points right (horizontally flipped)
- Hardened: JavaScript handling of e.target.closest() when clicking on text nodes in theme files
3.2.1 - 2025-11-02
- Refined: Deduplication mode setting now saves correctly when changed via Training Mode dropdown
- Refined: Product prioritization now correctly queries sales metrics from temp_orders table
- Refined: Embedding statistics now accurately count only parent products (excludes individual variations)
- Refined: All product queries now consistently filter by published status for accurate counts
- Refined: Training and statistics now use matching data sources to prevent count mismatches
3.2 - 2025-11-01
- NEW: Support for Pages and Posts in visual editors (Elementor, WP Bakery, TagDiv Composer) - AI Chat now extracts content from page builders
- NEW PRO: Process Automation feature - Schedule automatic data analysis and embedding updates (daily/weekly at custom times)
- NEW PRO: Contextual Metadata - Enhanced chat with device profile, browsing history, and user preferences for personalized recommendations
- NEW PRO: AI Session Tracker (Beta) - Track customer engagement depth, product interactions, and cart behavior with zero cost alternative to Google Analytics BigQuery
- Improved: Added helpful documentation links for product priority metrics
- Improved: Better HTML structure for configuration sections in AI Chat settings
- Improved: Enhanced visual consistency across admin panels
- Refined: Posts & Pages configuration header now extends properly across full width
- Polished: Various minor UI/UX improvements
3.1.2 - 2025-10-31
- NEW: Added referral links tracking for better affiliate program management
- Improved: Enhanced tracking capabilities for referral campaigns
- Improved: Better analytics for referral link performance
3.1.1 - 2025-10-30
- CRITICAL UPDATE: Hardened activation so core product tables are created reliably on first plugin activation (resolving a prior race condition)
- CRITICAL UPDATE: Resolved "PROCEDURE already exists" notices during plugin activation by dropping procedures before creating them
- Refined: Core tables now reliably created on initial activation without needing deactivate/reactivate
- Refined: Stored procedures now recreate cleanly during activation
- Refined: Legacy stored procedures from older plugin versions now properly cleaned up during activation/deactivation
- Improved: More robust plugin activation process with idempotent procedure creation
- Improved: Complete database cleanup on deactivation (removes all procedures including legacy ones)
- Updated: Plugin tags to include AI Chat, OpenAI, Anthropic, Voyage, Multiple Embeddings, Reranking, Semantic Search
3.1
- NEW: Separate mobile and desktop widget positioning for optimal UX across devices
- NEW: Support for flexible dimension units (px, vh, %, vw) for responsive chat widget sizing
- Improved: Mobile chat widget responsiveness and input visibility
- Refined: Chat widget positioning on mobile devices
- Refined: Input box visibility on all screen sizes
3.0
- NEW: AI-Powered Chat feature with support for latest Anthropic Claude and OpenAI engines
- NEW: Support for cutting-edge AI models (Claude Opus 4.1, Claude Sonnet 4.5, Claude Haiku 4.5, GPT-5, GPT-4, GPT-o1, GPT-3.5)
- NEW: Advanced embedding engines for semantic search (Voyage AI: voyage-3.5-large, voyage-3.5-lite, voyage-3-lite, voyage-finance-2)
- NEW: OpenAI embeddings support (text-embedding-3-large, text-embedding-3-small, text-embedding-ada-002)
- NEW: Customizable chat templates for different use cases
- NEW: Product catalog integration with AI-powered semantic similarity matching
- NEW: Smart product search and recommendations powered by AI embeddings
- NEW: Customizable chat appearance with theme options (Rounded/Square)
- NEW: Dynamic color customization for complete branding control
- NEW: Session management and chat history tracking
- NEW: Floating chat widget with adjustable positioning
- NEW: Mobile-responsive chat design
- Improvement: WordPress coding standards compliance
- Improvement: Enhanced database query preparation
- Improvement: AI Session Tracker (Beta)
- Improvement: Translation support improvements with proper translator comments
- Refinement: Date/time functions now use timezone-safe gmdate()
- Refinement: Chat input no longer inherits theme styles
- Polish: Various appearance refinements
2.0
- Compatibility: Enhanced compatibility with MariaDB 11+ and MySQL 9.0
- Compatibility: Added support for PHP 8.4
- Refinement: Removed hardcoded collation statements to use database defaults
- Refinement: Prefixed admin CSS classes to prevent conflicts with other plugins
- Various minor refinements and improvements
1.0