{"id":192766,"date":"2024-04-24T05:24:36","date_gmt":"2024-04-24T05:24:36","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ai-eshop-optimizer\/"},"modified":"2026-06-05T21:32:29","modified_gmt":"2026-06-05T21:32:29","slug":"ai-eshop-optimizer","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/ai-eshop-optimizer\/","author":21057082,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"7.1","stable_tag":"7.1","tested":"7.0","requires":"5.7","requires_php":"7.4","requires_plugins":null,"header_name":"AI eShop Optimizer","header_author":"Oxford Metadata Ltd","header_description":"Boost sales with AI-powered product recommendations. Effortlessly optimize upsells and cross-sells for store success!","assets_banners_color":"5f626f","last_updated":"2026-06-05 21:32:29","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/rooster.systems\/get-aieo\/","header_author_uri":"https:\/\/oxfordmetadata.co.uk","rating":5,"author_block_rating":0,"active_installs":20,"downloads":2369,"num_ratings":2,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"1.0":{"tag":"1.0","author":"oxfordmetadata","date":"2025-10-17 04:47:57"},"2.0":{"tag":"2.0","author":"oxfordmetadata","date":"2025-10-17 05:22:32"},"2.1":{"tag":"2.1","author":"oxfordmetadata","date":"2025-10-18 04:09:39"},"3.0":{"tag":"3.0","author":"oxfordmetadata","date":"2025-10-30 22:39:30"},"3.1":{"tag":"3.1","author":"oxfordmetadata","date":"2025-10-30 22:53:26"},"3.1.1":{"tag":"3.1.1","author":"oxfordmetadata","date":"2025-10-31 05:56:05"},"3.1.2":{"tag":"3.1.2","author":"oxfordmetadata","date":"2025-10-31 07:19:41"},"3.1.3":{"tag":"3.1.3","author":"oxfordmetadata","date":"2025-10-31 07:56:29"},"3.2":{"tag":"3.2","author":"oxfordmetadata","date":"2025-11-01 12:45:04"},"3.2.1":{"tag":"3.2.1","author":"oxfordmetadata","date":"2025-11-01 22:53:17"},"3.3":{"tag":"3.3","author":"oxfordmetadata","date":"2025-11-03 11:58:01"},"3.3.1":{"tag":"3.3.1","author":"oxfordmetadata","date":"2025-11-03 21:53:36"},"3.3.2":{"tag":"3.3.2","author":"oxfordmetadata","date":"2025-11-04 14:18:24"},"3.3.3":{"tag":"3.3.3","author":"oxfordmetadata","date":"2025-11-05 12:23:48"},"3.4":{"tag":"3.4","author":"oxfordmetadata","date":"2025-11-06 09:14:22"},"3.5":{"tag":"3.5","author":"oxfordmetadata","date":"2025-11-07 11:25:29"},"3.5.1":{"tag":"3.5.1","author":"oxfordmetadata","date":"2025-11-07 17:10:50"},"3.5.2":{"tag":"3.5.2","author":"oxfordmetadata","date":"2025-11-11 22:07:11"},"3.6":{"tag":"3.6","author":"oxfordmetadata","date":"2025-11-13 03:54:50"},"4.0":{"tag":"4.0","author":"oxfordmetadata","date":"2025-11-27 22:43:29"},"4.1":{"tag":"4.1","author":"oxfordmetadata","date":"2026-02-02 19:19:35"},"4.2":{"tag":"4.2","author":"oxfordmetadata","date":"2026-02-02 19:27:31"},"5.0":{"tag":"5.0","author":"oxfordmetadata","date":"2026-05-20 14:19:10"},"5.1":{"tag":"5.1","author":"oxfordmetadata","date":"2026-05-21 07:57:58"},"5.10":{"tag":"5.10","author":"oxfordmetadata","date":"2026-05-28 16:54:50"},"5.2":{"tag":"5.2","author":"oxfordmetadata","date":"2026-05-21 12:50:43"},"5.3":{"tag":"5.3","author":"oxfordmetadata","date":"2026-05-22 12:59:19"},"5.4":{"tag":"5.4","author":"oxfordmetadata","date":"2026-05-23 03:58:56"},"5.5":{"tag":"5.5","author":"oxfordmetadata","date":"2026-05-23 10:57:52"},"5.6":{"tag":"5.6","author":"oxfordmetadata","date":"2026-05-23 18:18:00"},"5.7":{"tag":"5.7","author":"oxfordmetadata","date":"2026-05-24 07:20:25"},"5.8":{"tag":"5.8","author":"oxfordmetadata","date":"2026-05-26 20:03:36"},"5.9":{"tag":"5.9","author":"oxfordmetadata","date":"2026-05-28 03:17:11"},"6.0":{"tag":"6.0","author":"oxfordmetadata","date":"2026-05-29 13:21:51"},"6.1":{"tag":"6.1","author":"oxfordmetadata","date":"2026-05-31 14:14:37"},"6.2":{"tag":"6.2","author":"oxfordmetadata","date":"2026-05-31 22:18:48"},"6.3":{"tag":"6.3","author":"oxfordmetadata","date":"2026-06-02 10:36:42"},"6.4":{"tag":"6.4","author":"oxfordmetadata","date":"2026-06-03 09:52:12"},"7.0":{"tag":"7.0","author":"oxfordmetadata","date":"2026-06-05 12:49:25"},"7.1":{"tag":"7.1","author":"oxfordmetadata","date":"2026-06-05 21:32:29"}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3076271,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3076271,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3076744,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3076755,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3076755,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3562757,"resolution":false,"location":"assets","locale":"","contents":"{\"landingPage\":\"\\\/wp-admin\\\/plugins.php\",\"preferredVersions\":{\"php\":\"8.0\",\"wp\":\"latest\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"features\":{\"networking\":true},\"steps\":[{\"step\":\"installPlugin\",\"options\":{\"activate\":true},\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"ai-eshop-optimizer\"}},{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"}]}"}},"all_blocks":{"aieo\/brand-slider":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"aieo\/brand-slider","version":"1.0.0","title":"AIEO Brand Slider","category":"woocommerce","icon":"slides","description":"Lazy-hydrated brand carousel. Modes: top, new_brand, new_product, favourites (per-user affinity), manual. Server-renders the first N cards as a noscript fallback; client hydrates into a vanilla scroll-snap carousel with arrow nav.","keywords":["aieo","brands","slider","carousel"],"supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"mode":{"type":"string","default":"top","enum":["top","new_brand","new_product","favourites","manual"]},"limit":{"type":"number","default":10},"slidesPerView":{"type":"number","default":5},"title":{"type":"string","default":""},"subtitle":{"type":"string","default":""},"ctaLabel":{"type":"string","default":""},"ctaUrl":{"type":"string","default":""},"manualBrandIds":{"type":"array","default":[]},"showCounts":{"type":"boolean","default":false},"cardStyle":{"type":"string","default":"hero","enum":["hero","logo"]}},"render":"file:.\/render.php","editorScript":"file:.\/edit.js","viewScript":"file:.\/view.js","style":"file:.\/style.css","textdomain":"ai-eshop-optimizer"},"aieo\/brand-rails":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"aieo\/brand-rails","version":"1.1.0","title":"AIEO Brand Rails","category":"woocommerce","icon":"category","description":"Stacked curated brand rails (Featured \/ New \/ Your Favourites \/ Top). Each rail has its own count and slides-per-view, configurable in the inspector.","keywords":["aieo","brands","rails","discovery"],"supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"showFeatured":{"type":"boolean","default":true},"showNew":{"type":"boolean","default":true},"showFavourites":{"type":"boolean","default":true},"showTop":{"type":"boolean","default":false},"newMode":{"type":"string","default":"new_product","enum":["new_product","new_brand"]},"topLimit":{"type":"number","default":0},"featuredLimit":{"type":"number","default":0},"newLimit":{"type":"number","default":0},"favouritesLimit":{"type":"number","default":0},"topSlidesPerView":{"type":"number","default":0},"featuredSlidesPerView":{"type":"number","default":0},"newSlidesPerView":{"type":"number","default":0},"favouritesSlidesPerView":{"type":"number","default":0},"limitPerRail":{"type":"number","default":10},"slidesPerView":{"type":"number","default":5}},"render":"file:.\/render.php","editorScript":"file:.\/edit.js","style":"file:.\/style.css","textdomain":"ai-eshop-optimizer"},"aieo\/brand-azindex":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"aieo\/brand-azindex","version":"1.0.0","title":"AIEO Brand A-Z Index","category":"woocommerce","icon":"list-view","description":"Server-rendered A-Z brand directory. Every letter A\u2013Z (plus '#' for non-Latin brands) is always present; empty letters render disabled. Sticky letter bar + per-letter brand grid with product counts. Reads exclusively from wp_aieo_core_brand_vitals.","keywords":["aieo","brands","a-z","directory","catalogue"],"supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"showCounts":{"type":"boolean","default":true},"showLogos":{"type":"boolean","default":true},"stickyBar":{"type":"boolean","default":true},"headingLevel":{"type":"string","default":"h2","enum":["h2","h3","h4"]},"showHashBucket":{"type":"boolean","default":true}},"render":"file:.\/render.php","viewScript":"file:.\/view.js","editorScript":"file:.\/edit.js","style":"file:.\/style.css","textdomain":"ai-eshop-optimizer"}},"tagged_versions":["1.0","2.0","2.1","3.0","3.1","3.1.1","3.1.2","3.1.3","3.2","3.2.1","3.3","3.3.1","3.3.2","3.3.3","3.4","3.5","3.5.1","3.5.2","3.6","4.0","4.1","4.2","5.0","5.1","5.10","5.2","5.3","5.4","5.5","5.6","5.7","5.8","5.9","6.0","6.1","6.2","6.3","6.4","7.0","7.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3076322,"resolution":"1","location":"assets","locale":"","width":2682,"height":5862},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3389715,"resolution":"10","location":"assets","locale":"","width":2374,"height":1248},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3389715,"resolution":"11","location":"assets","locale":"","width":2349,"height":1246},"screenshot-12.png":{"filename":"screenshot-12.png","revision":3389715,"resolution":"12","location":"assets","locale":"","width":2348,"height":947},"screenshot-13.png":{"filename":"screenshot-13.png","revision":3388833,"resolution":"13","location":"assets","locale":"","width":662,"height":854},"screenshot-14.png":{"filename":"screenshot-14.png","revision":3388833,"resolution":"14","location":"assets","locale":"","width":653,"height":828},"screenshot-15.png":{"filename":"screenshot-15.png","revision":3388833,"resolution":"15","location":"assets","locale":"","width":666,"height":924},"screenshot-16.png":{"filename":"screenshot-16.png","revision":3388833,"resolution":"16","location":"assets","locale":"","width":657,"height":623},"screenshot-17.png":{"filename":"screenshot-17.png","revision":3388833,"resolution":"17","location":"assets","locale":"","width":661,"height":533},"screenshot-18.png":{"filename":"screenshot-18.png","revision":3388833,"resolution":"18","location":"assets","locale":"","width":663,"height":839},"screenshot-19.png":{"filename":"screenshot-19.png","revision":3388833,"resolution":"19","location":"assets","locale":"","width":658,"height":919},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3076322,"resolution":"2","location":"assets","locale":"","width":2455,"height":1341},"screenshot-20.png":{"filename":"screenshot-20.png","revision":3388833,"resolution":"20","location":"assets","locale":"","width":655,"height":634},"screenshot-21.png":{"filename":"screenshot-21.png","revision":3388833,"resolution":"21","location":"assets","locale":"","width":654,"height":638},"screenshot-22.png":{"filename":"screenshot-22.png","revision":3388833,"resolution":"22","location":"assets","locale":"","width":652,"height":631},"screenshot-23.png":{"filename":"screenshot-23.png","revision":3390442,"resolution":"23","location":"assets","locale":"","width":1990,"height":1244},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3076322,"resolution":"3","location":"assets","locale":"","width":1792,"height":568},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3076322,"resolution":"4","location":"assets","locale":"","width":1791,"height":878},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3076322,"resolution":"5","location":"assets","locale":"","width":2441,"height":593},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3076322,"resolution":"6","location":"assets","locale":"","width":1791,"height":357},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3076322,"resolution":"7","location":"assets","locale":"","width":2435,"height":434},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3380380,"resolution":"8","location":"assets","locale":"","width":1500,"height":732},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3380380,"resolution":"9","location":"assets","locale":"","width":765,"height":1036}},"screenshots":[]},"plugin_section":[],"plugin_tags":[90336,232,16141,148323,250171],"plugin_category":[45],"plugin_contributors":[],"plugin_business_model":[],"class_list":["post-192766","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-chat","plugin_tags-analytics","plugin_tags-content-recommendations","plugin_tags-conversational-ai","plugin_tags-embeddings","plugin_category-ecommerce","plugin_committers-oxfordmetadata"],"banners":{"banner":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/banner-772x250.png?rev=3076755","banner_2x":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/banner-1544x500.png?rev=3076755","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/icon.svg?rev=3076744","icon":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/icon.svg?rev=3076744","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-1.png?rev=3076322","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-2.png?rev=3076322","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-3.png?rev=3076322","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-4.png?rev=3076322","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-5.png?rev=3076322","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-6.png?rev=3076322","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-7.png?rev=3076322","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-8.png?rev=3380380","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-9.png?rev=3380380","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-10.png?rev=3389715","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-11.png?rev=3389715","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-12.png?rev=3389715","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-13.png?rev=3388833","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-14.png?rev=3388833","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-15.png?rev=3388833","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-16.png?rev=3388833","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-17.png?rev=3388833","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-18.png?rev=3388833","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-19.png?rev=3388833","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-20.png?rev=3388833","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-21.png?rev=3388833","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-22.png?rev=3388833","caption":""},{"src":"https:\/\/ps.w.org\/ai-eshop-optimizer\/assets\/screenshot-23.png?rev=3390442","caption":""}],"raw_content":"<!--section=description-->\nAI eShop Optimizer - AI Chat &amp; Content Recommendations Plugin\n\n<p>Welcome to AI eShop Optimizer, the premier AI-driven solution for intelligent customer engagement powered by the latest AI models from Anthropic and OpenAI.<\/p>\n\n<p><strong>Works with or without WooCommerce<\/strong> - Perfect for:\n- E-commerce sites with WooCommerce for product recommendations\n- Corporate and content sites for intelligent chat assistance\n- Merchant information sites that need AI-powered customer support<\/p>\n\n<p>The plugin provides advanced AI chat capabilities with semantic search powered by state-of-the-art embedding engines. For WooCommerce sites, it also enables product recommendations through our graph-database powered service at https:\/\/eshop-optimizer.com.\nOur advanced AI tools uncover latent patterns and consumer preferences, empowering you with strategic upsell and cross-sell propositions.\nThe plugin also enables you to import with one click our recommendations - or any product recommendations in a csv file that conforms to our format - and to also monitor their performance using google UTM tags (which you may also use to monitor your own recommendations performace).<\/p>\n\n<h3>Features<\/h3>\n\n<h3>AI Product Recommendations<\/h3>\n\n<ul>\n<li>Harness the power of a semantic graph database for unmatched product pairing suggestions.<\/li>\n<li>Dive deep into your sales data to extract bespoke upsell and cross-sell opportunities.<\/li>\n<li>Beta-test participants reported a remarkable 57%+ annual surge in sales.<\/li>\n<li>Privacy-centric: Opt out of sharing product and category names and product prices with limited impact to the quality of the recommendations.<\/li>\n<li>Effortlessly back up and export current Upsells and Cross-sells.<\/li>\n<li>Leverage Google GA4 insights to gauge the success of your recommended pairings.<\/li>\n<\/ul>\n\n<h3>Products for the Same Needs<\/h3>\n\n<ul>\n<li>Automatically recommend products that fulfill the same customer needs<\/li>\n<li>Uses your product's need attributes (pa_need taxonomy) to find matching products<\/li>\n<li>Ranks suggestions by pre-computed sales performance from the product catalogue<\/li>\n<li>Intelligently excludes existing upsells and cross-sells to avoid duplicates<\/li>\n<li>Stores up to 6 optimized suggestions per product for fast retrieval<\/li>\n<li>Displays prominently on product pages (appears first, before other recommendations)<\/li>\n<li>Multi-tier caching for optimal performance (Object Cache + Database)<\/li>\n<li>Generate suggestions as part of Operational Efficiency workflow<\/li>\n<\/ul>\n\n<h3>Insights Chat \u2014 Claude-powered (NEW in 5.0)<\/h3>\n\n<ul>\n<li>Ask your shop questions in plain language from inside the WordPress admin<\/li>\n<li>Powered by the AI Chat Anthropic key you already have \u2014 no separate subscription<\/li>\n<li>33 purpose-built Claude data abilities resolved automatically via the WordPress Abilities API<\/li>\n<li>11 categorized accordion groups of suggestion chips \u2014 Customers, Brand portfolio, Recommendation rails, Attribution &amp; archives, Product needs audit, Star ratings, Content &amp; blog, Cross-skill, Store analytics, Promotions \/ launches \/ sales, Newsletters &amp; campaigns<\/li>\n<li>Cross-cuts orders, products, attribution, recommendations, ratings, blog engagement, and customer profiles<\/li>\n<li>Stays inside WooCommerce \u2014 no third-party BI subscription, no data export<\/li>\n<\/ul>\n\n<h3>Joint Session \u00d7 Attribution Analytics (NEW in 5.0)<\/h3>\n\n<ul>\n<li>Bridge between the Session Tracker (engagement) and the Attribution Engine (conversion) \u2014 both keyed off the same aieo_session_id cookie<\/li>\n<li>Blog-post attribution \u2014 clicks from blog posts to products now attribute correctly with the originating post_id<\/li>\n<li>Engagement-bucket buy-probability \u2014 empirical P(cart-add) per (scroll-quartile \u00d7 time-quartile \u00d7 mouse-activity) bucket per product<\/li>\n<li>Abandoned-cart triage, cart-removal analysis, rating \u00d7 conversion correlation, need \u00d7 conversion correlation<\/li>\n<li>Pre-aggregated daily rollup tables keep chat answers in single-digit milliseconds regardless of history depth<\/li>\n<\/ul>\n\n<h3>Insights Remote DB Streaming (NEW in 5.0, Pro)<\/h3>\n\n<ul>\n<li>Stream raw analytics events to your own operator-owned MariaDB \/ MySQL for unbounded BI access<\/li>\n<li>Reuses the existing ERP connection registry \u2014 same encrypted credentials, same audit trail<\/li>\n<li>Configurable export frequency (15 min \/ hourly \/ daily) with per-table lag dashboard<\/li>\n<li>Local-purge failsafe \u2014 hot rows are not deleted until the remote confirms receipt<\/li>\n<li>Net stable local database footprint ~1.1 GB year-over-year<\/li>\n<\/ul>\n\n<h3>Star Ratings \u2192 SEO Schema (NEW in 5.0)<\/h3>\n\n<ul>\n<li>AggregateRating JSON-LD automatically bridged into AIOSEO, Yoast, and RankMath via their schema filters<\/li>\n<li>Fallback head-injected JSON-LD when no SEO plugin is detected<\/li>\n<li>Per-feature enable\/disable toggle on the Star Ratings admin page<\/li>\n<li>Surface customer ratings to Google Rich Results without manually configuring each SEO plugin<\/li>\n<\/ul>\n\n<h3>Custom Slots + Tolstoy + Recommendations Ordering (NEW in 5.1)<\/h3>\n\n<ul>\n<li>Drag-and-drop \"Recommendations Ordering\" card on the e-shop Manager dashboard reorders every recommendation rail (Up-sells \/ Cross-sells \/ Related \/ Recently Viewed \/ Products for the same needs) and any operator-defined Custom Slot, with a per-row Show toggle to hide rails without removing them<\/li>\n<li>Custom Slots host arbitrary content alongside the built-in reco rails \u2014 two kinds per slot:\n\n<ul>\n<li>Tolstoy: paste a widget id + account UUID; AIEO assembles the <code>&lt;tolstoy-widget&gt;<\/code> tag and defer-loads the gotolstoy.com CDN script once per page<\/li>\n<li>HTML \/ code: rich-text WYSIWYG (TinyMCE) with a Code tab, accepts any HTML, embed scripts, image tags, or WooCommerce shortcodes (e.g. <code>[products limit=\"6\" orderby=\"popularity\"]<\/code>)<\/li>\n<\/ul><\/li>\n<li>Per-slot title with show\/hide toggle \u2014 renders with the same heading + underline styling as the built-in \"Recently Viewed Products\" \/ \"Related Products\" titles<\/li>\n<li>Cross-tab Tolstoy attribution \u2014 clicks from a Tolstoy carousel that lead to a cart-add are recorded as <code>source='tolstoy'<\/code> in wp_aieo_addcart_events with <code>source_meta = {slot_id, tolstoy_widget_id, clicked_url}<\/code> so reports can pivot on widget, carousel, or source product<\/li>\n<li>Works on BOTH FSE block themes (via the <code>.ff-recommendations-cluster<\/code> flex container + inline CSS <code>order:<\/code> rules) AND classic themes (via dynamic re-prioritisation of WooCommerce <code>woocommerce_after_single_product_summary<\/code> action hooks)<\/li>\n<\/ul>\n\n<h3>IAPI (Interactivity API) \u2014 WC Cart \/ Checkout block parity (NEW in 5.1)<\/h3>\n\n<ul>\n<li>Full integration with the modern WooCommerce block-based cart and checkout (driven by WordPress @wordpress\/interactivity)<\/li>\n<li>Side-cart, Swatches multi-select, Sticky Add-to-Cart, Wishlist, Star Ratings, Free-Shipping Display, Recommendations attribution all work on both surfaces \u2014 block-cart\/block-checkout AND legacy shortcode-cart\/shortcode-checkout<\/li>\n<li>AIEO_DMM_Swatches_Runtime supports dual-mode enqueue (<code>@aieo\/swatches-iapi<\/code> module when IAPI is on, jQuery bundle otherwise) with a single DOM contract<\/li>\n<li>WC Store API (<code>wc\/store\/cart<\/code>) endpoints recognised by the side-cart, attribution log, and waitlist subscribe flows so block-checkout actions are captured the same as classic checkout<\/li>\n<li>AIEO Custom Slots, Free-Shipping Display, and Trust Badges register their bridge-block render paths inside <code>woocommerce_blocks_loaded<\/code> so they're available in block-themed cart\/checkout templates via the Site Editor<\/li>\n<\/ul>\n\n<h3>Floating Mini-Cart + Free-Shipping Bar (NEW in 5.0)<\/h3>\n\n<ul>\n<li>Two-column floating mini-cart styled after the Rey theme \u2014 left column recommends \"You might like\", right column shows Shopping Bag \/ Recently Viewed<\/li>\n<li>Free-shipping progress bar right under the tab header<\/li>\n<li>500 ms debounced quantity AJAX \u2014 qty changes feel instant, no full cart recalculation on the server<\/li>\n<li>Session-level HTML cache (30 s TTL); WC fragments integration keeps every other widget in sync<\/li>\n<li>Sticky Add-to-Cart bar for product pages<\/li>\n<\/ul>\n\n<h3>Pricing Engine + Conversion Boosters (NEW in 5.0)<\/h3>\n\n<ul>\n<li>Per-role price overrides via CSV upload, with batch validation<\/li>\n<li>Brand-level % discounts with start\/end-date windows<\/li>\n<li>Loyalty class definitions + per-user assignments<\/li>\n<li>Stacking recipe: Role Pricing \u2192 Brand Discount \u2192 Loyalty Class \u2014 each customer sees the strongest applicable price<\/li>\n<li>Brand-based free-gift offers (cart subtotal threshold per brand)<\/li>\n<li>Configurable exit-intent modal with checkout-specific variant<\/li>\n<\/ul>\n\n<h3>Marketplace Connectors &amp; Shipping (NEW in 5.0)<\/h3>\n\n<ul>\n<li>Marketplace Order Importer \u2014 Skroutz \/ e-shop \/ Amazon orders flow into WooCommerce as native orders so attribution, stock, customer profiles, and fulfillment stay unified<\/li>\n<li>Per-vendor rotatable webhook tokens + configurable SKU lookup strategy<\/li>\n<li>Streaming marketplace feed generator (XML \/ CSV) for 35k-product catalogues<\/li>\n<li>Greek + Cypriot Shipment Tracking providers (replaces the WC plugin's US\/UK\/Canada\/Germany defaults)<\/li>\n<li>Smart Shipping Label \u2014 postcode-less carts see \"Carrier (\u0391\u03c0\u03cc \u20acX.XX)\" minimum rate so customers know shipping isn't free without seeing a misleading default<\/li>\n<\/ul>\n\n<h3>Customer Intelligence + Web Push (NEW in 5.0)<\/h3>\n\n<ul>\n<li>wp_aieo_customer_intelligence keyed by eponymous_id \u2014 omnichannel customer view (eshop + in-store) is the single source of truth<\/li>\n<li>Behavioural segments \u2014 Top customers, Lost cohort, Lookalikes, Abandoned-cart, reactivation<\/li>\n<li>Triggered web-push flows \u2014 welcome, reactivation, price-drop, back-in-stock \u2014 with full dispatch log + click attribution<\/li>\n<li>Customer Survey Intelligence \u2014 Gravity Forms ingest + 7 high-signal metrics (NPS class, satisfaction, priorities, discovery channel, gift preferences, personal profile) + composite VoC score<\/li>\n<li>\"Notify me when back in stock\" Waitlist with automatic stock-watcher emails<\/li>\n<li>Wishlist analytics \u2014 most-wishlisted products, surfaces, and pages driving adds<\/li>\n<\/ul>\n\n<h3>AI-Powered Chat (FREE)<\/h3>\n\n<ul>\n<li><strong>Support for latest AI models from Anthropic Claude and OpenAI:<\/strong>\n\n<ul>\n<li>Claude Opus 4.1, Claude Sonnet 4.5, Claude Haiku 4.5<\/li>\n<li>GPT-5, GPT-4, GPT-o1, GPT-3.5<\/li>\n<\/ul><\/li>\n<li><strong>Advanced embedding engines for semantic product search:<\/strong>\n\n<ul>\n<li>Voyage AI: voyage-3.5-large, voyage-3.5-lite, voyage-3-lite, voyage-finance-2<\/li>\n<li>OpenAI: text-embedding-3-large, text-embedding-3-small, text-embedding-ada-002<\/li>\n<\/ul><\/li>\n<li>Customizable chat templates for different use cases<\/li>\n<li>Smart product search and recommendations powered by AI embeddings<\/li>\n<li>Product catalog integration with semantic similarity matching<\/li>\n<li>Context-aware responses using customer behavior data<\/li>\n<li>Customizable chat appearance with multiple themes (Rounded\/Square)<\/li>\n<li>Dynamic color customization for branding<\/li>\n<li>Session management and chat history tracking<\/li>\n<li>Floating chat widget with adjustable positioning<\/li>\n<li>Mobile-responsive design<\/li>\n<\/ul>\n\n<h3>Advanced Session Analytics<\/h3>\n\n<ul>\n<li><strong>Custom Class-Based Event Tracking<\/strong> - Track clicks on any element using custom CSS selectors<\/li>\n<li><strong>Click Event Throttling<\/strong> - Prevent database flooding while maintaining accurate click counts<\/li>\n<li><strong>Cookie Consent Bypass Mode<\/strong> - Toggle GDPR compliance for immediate tracking or compliance-first approach<\/li>\n<li><strong>Product Image Click Tracking<\/strong> - Special tracking for product images with debounce to prevent duplicate events<\/li>\n<li><strong>Anti-Double-Counting<\/strong> - Custom rules take precedence over standard tracking<\/li>\n<li><strong>Automatic Cache Busting<\/strong> - Version strings with variable lengths for aggressive cache invalidation<\/li>\n<li><strong>Multi-Layer Cache Compatible<\/strong> - Works with Nginx, Varnish, REDIS, WP Rocket, Cloudflare<\/li>\n<\/ul>\n\n<h3>How to Use<\/h3>\n\n<ul>\n<li><p>Export and Back-Up Current Pairings\nSafely export existing upsells and cross-sells, which doubles as a reliable back-up. The Pro version also takes your current selections into account, potentially enhancing the AI's output.<\/p><\/li>\n<li><p>Accelerated Order Export (Enabled HPOS Required)\nSwiftly export up to 100,000 order items. The Pro version lifts the cap on orders, including comprehensive details like Order ID, Product ID, sequence, and more.\nExclude product titles and prices at will.\nMaintain customer anonymity by withholding CustomerIDs, albeit with a slight compromise on recommendation precision.\nOpt for a seasonal sales analysis, focusing on trends pertinent to the current time of year.\nRefine Your Data with Our AI Engine\nRegister at eshop-optimizer.com and submit your data. Within moments, receive refined upsell and cross-sell strategies for your leading products. Full catalog analysis available with the Pro version.\neshop-optimizer.com respects your privacy and adheres to strick privacy guidelines. Our company's, Oxford Metadata Ltd, privacy provisions has been approved by both Google and Facebook. For further details please visit: https:\/\/eshop-optimizer.com\/compliance<\/p><\/li>\n<li><p>Import Tailored Upsell and Cross-sell Strategies\nImplement the AI-crafted upsell and cross-sell suggestions via an easy-to-upload CSV file.<\/p><\/li>\n<li><p>Witness Enhanced Sales\nMarvel at the accuracy of our AI-driven recommendations and observe how they can boost your sales figures. We're so confident in our service that we offer free initial analyses - we believe you'll be eager for more and enthusiastic to spread the word!\n  Experience the relevance of our recommendations and discover how AI can improve your store's sales. We offer free analyses, and we are confident that you'll want more and share our plugin with your friends!<\/p><\/li>\n<\/ul>\n\n<p>For any queries or support, contact us at <a href=\"mailto:support@eshop-optimizer.com\">support@eshop-optimizer.com<\/a>.<\/p>\n\n\n\n<p>Website: (https:\/\/eshop-optimizer.com)<\/p>\n\n<!--section=installation-->\n<p>Extract the contents of this plugin zip file into your wp-content\/plugins\/ directory locally.\nUpload the extracted folder to your website.\nNavigate to wp-admin\/plugins.php on your dashboard.\nFind 'AI eShop Optimizer' and activate the plugin.\nAlternatively, install directly through WordPress:<\/p>\n\n<p>Go to the 'Plugins' menu in WordPress.\nClick 'Add New' and search for 'AI eShop Optimizer.'\nInstall and activate directly from your dashboard.<\/p>\n\n<!--section=changelog-->\n<h4>7.1 - 2026-06-06<\/h4>\n\n<p><strong>First-party measurement &amp; consent \u2014 server-side Facebook Pixel\/CAPI + GA4, checkout active\/idle timing, and a lightweight Consent\/GDPR cookie banner (three buttons, cookie scanner, button theming, two layouts) \u2014 plus Custom Tabs and drag-and-drop Product Tab Ordering<\/strong><\/p>\n\n<ul>\n<li><strong>Pixels &amp; Conversions (server-side measurement).<\/strong> AIEO can now own the Facebook (Meta) Pixel and Google Analytics 4 end to end \u2014 a thin browser pixel <strong>and<\/strong> 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.<\/li>\n<li><strong>Consent \/ GDPR \u2014 first-party CMP.<\/strong> A lightweight, first-party cookie-consent banner (no external CMP, no IAB TCF bloat) on its own page: a <strong>rich-text message<\/strong>, <strong>three actions<\/strong> (Accept all \/ Decline \/ Customize) with a per-category preferences panel (necessary \/ functional \/ analytics \/ marketing), <strong>per-button colour theming<\/strong> (background \/ text \/ border + hover, with an equal-prominence guard so Decline can't be hidden), <strong>two layouts<\/strong> (bottom bar or a centre glass pop-up), a floating <strong>\u201cCookie settings\u201d<\/strong> button so visitors can change or withdraw consent, and a <strong>policy-version<\/strong> 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 <strong>cookie scanner<\/strong> classifies the cookies and third-party services your storefront sets (Google Fonts, GA4, the Meta pixel, YouTube, \u2026) against a curated database \u2014 populated automatically as visitors browse (no server crawl, names only, never values) \u2014 with an inventory you can re-classify.<\/li>\n<li><strong>Checkout timing.<\/strong> 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 fixed delay; coupon-completed orders are tagged and excludable from the baseline.<\/li>\n<li><strong>Custom Tabs (Product Display).<\/strong> Up to five extra product tabs you can switch on and rename at will (e.g. \"Application\", \"Ingredients\") \u2014 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.<\/li>\n<li><strong>Product Tab Ordering.<\/strong> 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.<\/li>\n<\/ul>\n\n<h4>7.0 - 2026-06-05<\/h4>\n\n<p><strong>Product-page layout builder (block + classic themes), a reusable product\/variation picker, and a master Button Styles control \u2014 plus side-cart mobile-bar styling (glass, per-icon, bubble), padding\/min-max\/glass for the master buttons, wishlist &amp; brand in the layout builder, and sticky admin navigation<\/strong><\/p>\n\n<ul>\n<li><strong>Side-cart mobile bottom bar.<\/strong> 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 a fix for the lone-cart badge alignment. The whole side-cart surface also moved to a shared class so the runtime can render it without the admin plugin.<\/li>\n<li><strong>Product Needs \u2014 Pills.<\/strong> New tag-style \"pills\" display alongside the list, with full pill styling (size, radius, padding, gap, colours, border).<\/li>\n<li><strong>Master Button Styles \u2014 padding, sizing, glass.<\/strong> 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).<\/li>\n<li><strong>Layout builder \u2014 Wishlist + Brand.<\/strong> \"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.<\/li>\n<li><p><strong>Admin polish.<\/strong> Fixed the toolbar icon stacking; reordered the AI Optimizer submenu (Data Prep \u2192 e-shop Manager \u2192 AI Chat \u2192 Interactivity (IAPI) \u2192 Rec Cache) and removed the Session Schema Migrator from the menu; the top bar + e-shop Manager sub-tab navigation are now sticky.<\/p><\/li>\n<li><p><strong>Product-page layout builder.<\/strong> One drag-and-drop \"Display Order\" list (Storefront Display \u2192 Single Product Page) now sets the vertical order of the whole product info column \u2014 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) \u2014 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.<\/p><\/li>\n<li><strong>Categories line restored.<\/strong> The clickable \"\u039a\u0391\u03a4\u0397\u0393\u039f\u03a1\u0399\u0395\u03a3\" 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.<\/li>\n<li><strong>Reusable product \/ variation picker.<\/strong> A modal browser \u2014 pick simple products, whole variable products, or specific variations \u2014 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.<\/li>\n<li><strong>Master Button Styles (Tools).<\/strong> 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 a bug that blanked the admin colour-picker swatches is fixed.<\/li>\n<li><strong>Admin discoverability.<\/strong> The Ctrl \/ \u2318-K navigator indexes the layout card and the Saved &amp; Abandoned Carts report; the AI Insights chat gained an abandoned-carts playbook and feature-location pointers.<\/li>\n<li><strong>Auto-restock.<\/strong> The e-shop's own sales (a distinct ERP invoice type) are excluded from physical-store demand so they can't trigger false restocks; out-of-stock cancellations now surface in the Stock Recovery Failures KPI.<\/li>\n<\/ul>\n\n<h4>6.5 - 2026-06-03<\/h4>\n\n<p><strong>Stock Recovery basket-turnover halo + per-branch pickers, Missing Hot Sellers published-benefit accounting, and ERP de-duplication<\/strong><\/p>\n\n<ul>\n<li><strong>Stock Recovery basket-turnover halo:<\/strong> a new column plus a \"Basket turnover protected\" KPI show the total value of the <em>whole<\/em> in-store orders each out-of-stock product appears in (not just its own line) \u2014 the real basket revenue you defend by keeping the product available, captured at restock and summed across all restocks.<\/li>\n<li><strong>Per-branch pickers + money-first sort:<\/strong> 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.<\/li>\n<li><strong>Missing Hot Sellers per-branch column<\/strong> showing which stores sell each not-yet-published SKU.<\/li>\n<li><strong>Missing Hot Sellers \"Published from this list\" accounting:<\/strong> 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) \u2014 quantifying the payoff of acting on the list.<\/li>\n<li><strong>ERP de-duplication:<\/strong> 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.<\/li>\n<li><strong>Recency window<\/strong> can now be set up to 365 days (was 180).<\/li>\n<\/ul>\n\n<h4>6.4 - 2026-06-02<\/h4>\n\n<p><strong>Missing Hot Sellers, variation descriptions on swatches, and clean activation on a fresh database<\/strong><\/p>\n\n<ul>\n<li>Missing Hot Sellers now lets you control what counts as a \"gap\" so the totals reflect real opportunities. An <strong>Include<\/strong> filter chooses which statuses appear \u2014 by default <strong>drafts to complete<\/strong> and <strong>products not in the eshop at all<\/strong>, while <strong>Private<\/strong> (one-time\/reciprocal offers you deliberately took offline) and <strong>Pending<\/strong> are excluded. The headline count, in-store turnover and estimated recoverable figure all follow the filter.<\/li>\n<li>New <strong>exclude-by-pattern<\/strong> field: list name or SKU substrings (e.g. recurring offers, coupons, gift vouchers, catch-all accounting SKUs like \"\u0394\u0399\u0391\u03a6\u039f\u03a1\u0391 \u0395\u0399\u0394\u0397\") and any matching product is dropped from the list and the totals \u2014 for current and future imports.<\/li>\n<li>The per-row <strong>Dismiss<\/strong> still removes a single SKU permanently; dismissed items now appear in a <strong>manage list with a Restore link<\/strong>, so exclusions are no longer one-way. All filtering happens at read-time (no re-detection needed).<\/li>\n<li>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 - \u0391\u03bd\u03bf\u03b9\u03c7\u03c4\u03cc\u03c7\u03c1\u03c9\u03bc\u03bf\") shown when you hover an image swatch, under the product title on selection, and \u2014 alongside the attribute \u2014 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 (<code>aieo_dmm_swatch_cart_desc_label<\/code>).<\/li>\n<li>Removed the PHP warnings emitted on first activation against a fresh database \u2014 <code>Undefined array key \"index_type\" \/ \"index_name\" \/ \"index_columns\" \/ \"column_name\"<\/code> from <code>wp-admin\/includes\/upgrade.php<\/code>, followed by <code>Cannot modify header information - headers already sent<\/code> (the warning output broke the post-activation redirect). WordPress's <code>dbDelta()<\/code> parses <code>CREATE TABLE<\/code> line by line and mis-reads blank lines (as empty indexes) and <code>--<\/code> SQL comments (as columns) once PHP 8 surfaces undefined-array-key warnings. A new <code>aieo_dbdelta()<\/code> 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.<\/li>\n<\/ul>\n\n<h4>6.3 - 2026-06-02<\/h4>\n\n<p><strong>Paid-traffic attribution (Facebook + TikTok + Google), offer-targeting correctness, catalogue-query hardening<\/strong><\/p>\n\n<ul>\n<li>Attribution: full paid-social support. The session attribution now captures the raw click id (fbclid \/ ttclid \/ gclid \/ gbraid \/ msclkid \/ \u2026) for Conversions-API &amp; offline-conversion uploads, plus the campaign -&gt; ad set \/ ad group -&gt; ad hierarchy (Meta <code>ad_id<\/code> \/ <code>adset_id<\/code> \/ <code>campaign_id<\/code>, TikTok and Google <code>adgroup_id<\/code>), so paid campaigns can be analysed down to the ad. TikTok and Google iOS (<code>gbraid<\/code> \/ <code>wbraid<\/code>) clicks are now classified correctly, and Instagram link shares stay \"social\" (not mis-tagged as paid).<\/li>\n<li>Product discounts \/ Free gifts \/ Free shipping \u2014 targeting correctness:\n\n<ul>\n<li>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).<\/li>\n<li>The \"Specific products\" whitelist is now enforced \u2014 an offer that requires one of those products only applies when the cart actually contains one.<\/li>\n<li>Per-product discounts now honour the exclusion lists, and cart-conditional discounts (minimum subtotal \/ specific-products) no longer apply unconditionally.<\/li>\n<li>Fixed a double-discount that could apply the percentage twice on cart lines when \"apply discount to the main product price\" was enabled.<\/li>\n<li>Free-gift awards now respect exclusions and the specific-products whitelist.<\/li>\n<\/ul><\/li>\n<li>Fixed brand-only discounts being mis-attributed across every line in the offer ROI reports.<\/li>\n<li>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.<\/li>\n<li>Performance: product targeting lookups are memoised within a request (fewer repeated taxonomy reads during cart and shipping calculation).<\/li>\n<li>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) \u2014 sample products are now excluded via a cached id list.<\/li>\n<li>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 \u2014 so the figures match the suggestion.<\/li>\n<li>New: Multi-Attribute Variations tool (Catalog Sync \u2192 Stock Management) \u2014 lists variable products that use more than one attribute for variations (e.g. colour \u00d7 size). Allowed by default (a master switch lets you turn on a save-guard that blocks them in catalogues where it's a mistake).<\/li>\n<\/ul>\n\n<h4>6.2 - 2026-06-01<\/h4>\n\n<p><strong>Flat-vitals data sourcing, schedulable predictor, recovery insights<\/strong><\/p>\n\n<ul>\n<li>SKU and barcode (GTIN) indices are now precomputed into the core product vitals table on every build \u2014 rolled up per parent in the variation-combine step \u2014 and a <code>parent_id<\/code> index was added. SKU\/barcode lookups now read a single flat vitals row instead of joining the legacy Pods table.<\/li>\n<li>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 \u2014 previously only the manual \"Run now\" used batches.<\/li>\n<li>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.<\/li>\n<li>Missing Hot Sellers: new card totalling the in-store sales currently missing online (products, units, turnover).<\/li>\n<li>Stock Recovery confidence thresholds each get a plain-language hover tooltip explaining the setting and how to tune it.<\/li>\n<li>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.<\/li>\n<li>Fixed: the full bundled translation could be shadowed by an incomplete wp.org language pack (e.g. a 10-string Greek pack), leaving most of the admin UI in English. The plugin now forces its bundled translation to take precedence over an incomplete global language pack.<\/li>\n<\/ul>\n\n<h4>6.1 - 2026-05-31<\/h4>\n\n<ul>\n<li>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) \u2014 with recovered-sales (units + \u20ac) and success\/failure tracking.<\/li>\n<li>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.<\/li>\n<li>Catalog Sync reorganised into a two-column panel (Stock Management \/ Sync &amp; Feeds).<\/li>\n<li>Sales\/out-of-stock predictor now runs from the UI in batches (no timeout); grain\/anchor controls realigned.<\/li>\n<li>All Insights reports (wpDataTables) re-pointed to the AIEO schema; two new Insights-chat skills for the data above.<\/li>\n<li>Fixed a harmless \"Duplicate column name 'entry_source'\" notice on deactivate\/reactivate.<\/li>\n<\/ul>\n\n<h4>6.0 - 2026-05-29<\/h4>\n\n<p><strong>Block-checkout COD gating suite, BoxNow Partner API, payment-method reactivity<\/strong><\/p>\n\n<ul>\n<li>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 \u2014 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 <code>canMakePayment<\/code> block callback that updates reactively on every country\/shipping change, no reload<\/li>\n<li>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 <code>_rule_{id}<\/code> suffix stripped) before matching so every carrier resolves correctly<\/li>\n<li>NEW: per-courier COD fee override with a <code>{cod_fee}<\/code> placeholder in the gateway description that resolves to the courier-specific amount. Decimal entry accepts both <code>.<\/code> and <code>,<\/code><\/li>\n<li>Performance: the entire gating layer only registers its filters \/ block JS when a country, courier, or fee override is actually configured \u2014 stores on plain default COD pay no runtime cost<\/li>\n<li>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<\/li>\n<li>NEW: BoxNow Partner API driver \u2014 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 \u2192 label \u2192 cancel on production. Credentials live in <code>courier_boxnow<\/code> settings; <code>build_voucher_payload()<\/code> now passes <code>order_id<\/code> so the driver can read the customer's chosen locker<\/li>\n<li>NEW: Skroutz \/ Shopflix feeds emit <code>color<\/code> + <code>additional_image<\/code> for the \"\u039c\u03cc\u03b4\u03b1\" (fashion) category, sourced from core product vitals. Skroutz wraps colour in CDATA and emits <code>&lt;color\/&gt;<\/code> when empty so the field is present on every product<\/li>\n<li>Fixed: checkout landing message now spans the content width (carries the theme <code>alignwide<\/code> class) so it lines up with the checkout\/cart rows below<\/li>\n<li>Fixed: chat model selection now saves newly released models (e.g. Claude Opus 4.8) \u2014 the Save handler validates against the model registry instead of a hardcoded whitelist that silently reverted the choice<\/li>\n<li>Fixed: <code>array_map()<\/code> fatal on the chat-model save path, plus four more <code>(array) sanitize_text_field($_POST[...])<\/code> array-swallowing anti-patterns (embedding manager, ratings, TRS zone admin, DMM social login)<\/li>\n<li>Removed: the deprecated legacy shipment-tracking module (AIEO Fulfillment tracking supersedes it; orphaned option cleaned up)<\/li>\n<\/ul>\n\n<h4>5.10 - 2026-05-28<\/h4>\n\n<p><strong>Shopflix voucher endpoint fix + admin list-table per-page caps<\/strong><\/p>\n\n<ul>\n<li>Fixed: Shopflix voucher PDFs were coming back with the wrong layout\/rotation. The print endpoint expects <code>\/shipments\/{trackingNumber}\/print<\/code>, not <code>\/shipments\/{orderId}\/print<\/code> \u2014 Shopflix support confirmed 2026-05-28. We now capture <code>trackingNumber<\/code> from the create response (with a <code>\/orders\/{id}<\/code> fallback for already-existing shipments) and call print correctly. Vouchers now respect the merchant-portal-selected label format<\/li>\n<li>NEW: admin list-table per-page caps. Tools tab \u2192 \"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\u2013600) get clamped on the next render. Settings are administrator-only \u2014 shop managers see the card but it's overlaid with a frosted \"Administrator only\" lock. Cap=0 disables enforcement for that screen<\/li>\n<\/ul>\n\n<h4>5.9 - 2026-05-28<\/h4>\n\n<p><strong>AS async runner restored, admin-bar menu, Shopflix error decoder, re-ship of ACS driver<\/strong><\/p>\n\n<ul>\n<li>Critical fix: ensures the ACS Courier driver fixes 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 get the 10 fixes 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<\/li>\n<li>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 fix<\/li>\n<li>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<\/li>\n<li>Fixed: Shopflix accept errors are now human-readable. The Shopflix API returns errors under <code>error.message<\/code> + <code>error.code<\/code>, but our parser was reading <code>error.errorMessage<\/code> and falling 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<\/li>\n<\/ul>\n\n<h4>5.8 - 2026-05-24 to 2026-05-26<\/h4>\n\n<p><strong>Three-day stretch \u2014 COD surcharge fix, Skroutz webhook repair, ACS Courier driver rewrite, AS dedup hardening, fulfillment polish<\/strong><\/p>\n\n<ul>\n<li>Fixed: COD payment method was hidden at checkout when the cart used a non-whitelisted shipping slug. AIEO now 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<\/li>\n<li>Fixed: COD fee now overwrites a same-label legacy fee instead of skipping via idempotency. Operator-set \u20acX is authoritative<\/li>\n<li>Marketplace Order Importer \u2014 Skroutz webhook integration repaired end-to-end: parser accepts both wrapped <code>{event_type, order:{\u2026}}<\/code> and flat <code>{event_type, id, code, \u2026}<\/code> payload shapes; falls back to <code>order.code<\/code> when Skroutz omits the numeric <code>id<\/code>; uses Skroutz's current line-item field names (<code>product_name<\/code> \/ <code>unit_price<\/code> \/ <code>total_price<\/code>); Mapper survives orphaned product references via try\/catch + free-form line-item fallback<\/li>\n<li>NEW: <code>REGISTERED<\/code> state added to the MOI Accept\/Reject button allowlist so Shopflix orders in their initial state actually show the action buttons<\/li>\n<li>ACS Courier driver \u2014 ten fixes audited against the official ACS Rest API docs: response envelope preserved (so <code>ACSExecution_HasError<\/code> + per-row <code>Error_Message<\/code> reach the UI); response traversal corrected to <code>ACSOutputResponce.ACSValueOutput<\/code>; address split into street + number; Greek phone landline\/cell split with <code>+30<\/code> stripping; <code>Charge_Type<\/code> defaults to <code>2<\/code>, auto-switches to <code>4<\/code> when COD; <code>Acs_Delivery_Products<\/code> auto-appends <code>COD<\/code> when <code>cod_amount &gt; 0<\/code>; print uses the correct <code>ACS_Print_Voucher<\/code> alias and decodes the base64 PDF; cancel uses the correct <code>ACS_Delete_Voucher<\/code> alias; <code>Weight<\/code> + <code>Cod_Ammount<\/code> now sent as JSON numbers (was being parsed by ACS with Greek locale, multiplying decimals by 10 on the printed label)<\/li>\n<li>NEW: Recompute queue \u2014 atomic dedup at the AS schedule layer. New <code>pre_as_schedule_*<\/code> filters with MySQL <code>GET_LOCK<\/code> short-circuit <code>as_schedule_*<\/code> 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 the fix)<\/li>\n<li>Fixed: Session Tracker <code>trackAddToCart<\/code> now guards <code>$button.*<\/code> access and falls back to page context when callers fire <code>added_to_cart<\/code> without the 4th <code>$button<\/code> arg. Fixes the spinner-stuck symptom on the swatches bulk-add path<\/li>\n<li>NEW: Fulfillment vouchers \u2014 <code>postal_code<\/code> column stored at voucher creation. Migration is idempotent and runs on plugin upgrade<\/li>\n<li>Fixed: Stock import now strips the UTF-8 BOM, transcodes Windows-1253 \/ ISO-8859-7 \u2192 UTF-8, and synthesises a header row when the first line is data. Greek-locale Excel exports import without manual conversion<\/li>\n<li>NEW: Price export \u2014 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<\/li>\n<li>Marketplace feeds \u2014 field parity with the wpwoof reference + universal <code>?cf-no-cache=1<\/code> cache-bust on every emitted URL. Fixes the long-standing <code>g:price<\/code> bug that was emitting the sale price instead of the regular price<\/li>\n<li>NEW: Geniki monthly invoice CSV reconciliation card on Fulfillment \u2192 Reports. Matches invoice rows to voucher rows; surfaces orphans either direction. Pattern is carrier-agnostic; Geniki is the first integrated<\/li>\n<li>Bulk fulfillment actions are now memory-protected. Lifts the practical limit from ~40 orders to 200\u2013500+ depending on the carrier API<\/li>\n<li>Critical fix: WC 10.9 compat migration was looping forever. Replaced the broken \"_product_image_gallery missing\" gate with explicit <code>_aieo_variation_migrated<\/code> markers (one prod site ran the loop 153,219 times across 2.5 days). New operator UI in DMM \u2192 Variations gallery exposes the migration state<\/li>\n<li>Fixed: Variation image storage now uses a two-hop join via <code>_product_image_gallery<\/code> (WC 10.9 canonical) \u2192 <code>_thumbnail_id<\/code> \u2192 parent featured. Fixes the \"variation image renders as the 40\u00d740 swatch chip\" regression<\/li>\n<li>Fixed: Star ratings mobile non-FSE alignment + caption wrap. Defeats Botiga's universal <code>button { min-width: ... }<\/code> rule that pushed empty stars onto a second row<\/li>\n<\/ul>\n\n<h4>5.7 - 2026-05-24<\/h4>\n\n<p><strong>Day-after follow-up to 5.6 \u2014 runtime-only brand blocks, engagement-gated Web Push, plus three small admin polish items<\/strong><\/p>\n\n<p><strong>Web Push \u2014 engagement-gated banner (Chrome quiet-UI mitigation)<\/strong>\n* NEW: the opt-in banner no longer mounts on a flat <code>setTimeout(SHOW_DELAY_MS)<\/code>. It now waits for AIEO Session Tracker to dispatch an <code>aieo:engagement<\/code> CustomEvent on <code>document<\/code> at one of these milestones: <code>pageviews-2<\/code>, <code>pageviews-3<\/code>, <code>scroll-25<\/code>, <code>scroll-50<\/code>, <code>scroll-75<\/code>, <code>add-to-cart<\/code>, <code>time-30s<\/code>. The \"Show delay (ms)\" admin setting becomes a minimum-wait floor (banner never appears before that even if scroll fires at 2s)\n* NEW: hard-cap fallback at 90s \u2014 visitors who never hit a milestone but also don't bounce still see the banner eventually\n* 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\n* Why this matters: Chrome's <a href=\"https:\/\/developer.chrome.com\/blog\/quieter-permission-ui-for-notifications\/\">quieter notification permission UI<\/a> auto-denies prompts on domains with low acceptance rates. Asking bounce visitors on first-page-load poisons the reputation \u2014 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\n* Engagement signal source: <code>AIEO_SESSION_TRACKER.pageViewsInSession<\/code> (new public property, sessionStorage-backed, incremented eagerly even for bounce visitors so counts are accurate). New <code>aieo:engagement<\/code> CustomEvent is also dispatched from inside <code>trackAddToCart<\/code> and <code>trackScrollDepth<\/code> so other consumers can hook in too \u2014 no new tracker, just extends what's already there<\/p>\n\n<p><strong>Brand blocks now runtime-resolvable \u2014 admin plugin no longer required for storefront pages that render <code>aieo\/brand-*<\/code><\/strong>\n* NEW: <code>AIEO_Runtime_Brand_Blocks<\/code> delegate in the runtime plugin registers the six brand-related server-rendered blocks (<code>aieo\/brand-azindex<\/code>, <code>brand-slider<\/code>, <code>brand-rails<\/code>, <code>brand-related<\/code>, <code>brand-archive-hero<\/code>, <code>brand-story<\/code>) at <code>init<\/code> 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); <code>AIEO_Core_Brand_Vitals<\/code> autoloads via the mu-plugins autoloader regardless of admin being active\n* <code>AIEO_Blocks_Loader::register_blocks()<\/code> now consults <code>WP_Block_Type_Registry::is_registered()<\/code> before each <code>register_block_type()<\/code> call \u2014 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 <code>_doing_it_wrong<\/code> notices from duplicate registration)\n* Shared style handle <code>aieo-article-cards<\/code> (needed by brand-related) is also registered by the runtime delegate so brand-related renders correctly in runtime-only mode\n* 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 \u2014 same render output, ~40 ms saved per page on cold-cache fetches<\/p>\n\n<p><strong>Fix \u2014 Session Tracker JS 404 + MIME-type refusal on every front-end page<\/strong>\n* Fixed: <code>aieo-session-tracker.js<\/code> returned HTTP 404 with <code>text\/html<\/code> body because the class was moved to the runtime plugin (Phase 1.5) but the JS asset was left behind in the admin plugin. <code>plugin_dir_url(__FILE__) . '..\/assets\/js\/aieo-session-tracker.js'<\/code> from the runtime class resolved to <code>runtime\/assets\/js\/aieo-session-tracker.js<\/code> \u2014 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<\/p>\n\n<p><strong>Critical fix \u2014 Web Push: opt-in pipeline broken by deferred JS + Service-Worker 404 + silent localStorage throws<\/strong>\n* Fixed: <code>AIEO_DMM_Web_Push<\/code> now registers <code>rocket_delay_js_exclusions<\/code> on activation so WP Rocket's \"Delay JavaScript execution\" feature stops treating <code>aieo-push-optin<\/code>, <code>aieoPush<\/code>, <code>aieo-push-sw<\/code> and <code>aieo-magic-link-modal<\/code> 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 \u2014 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\n* Fixed: <code>aieo-push-optin.js<\/code> silently died on Edge's Tracking Prevention (and Safari ITP) when <code>localStorage.getItem()<\/code> threw \u2014 the unguarded call killed the entire IIFE before the banner could even render. Now wrapped in try\/catch; blocked storage is treated as \"no cooldown set\" so the banner still appears\n* NEW: silent re-subscribe path \u2014 when <code>Notification.permission === 'granted'<\/code> from a prior visit but no <code>wp_aieo_push_subscriptions<\/code> row exists (e.g. the earlier SW-404 bug killed the original POST), the JS now silently registers the SW, calls <code>pushManager.subscribe()<\/code> and POSTs the result on page load. No banner re-prompt, no operator action \u2014 historical \"granted but never recorded\" users heal themselves on next visit\n* Improved: <code>postSubscription()<\/code> now checks <code>response.ok<\/code> and throws on non-2xx so the outer try\/catch records the failure instead of fire-and-forget. CFG.debug-gated console output for the operator who wants to dig in\n* See <a href=\"docs\/WEB_PUSH_INSTALL.md\">docs\/WEB_PUSH_INSTALL.md \u00a74<\/a> for the Nginx <code>location = \/aieo-push-sw.js<\/code> block \u2014 the third leg of this trio (404 SW URL was the upstream root cause on the FF prod incident 2026-05-23)<\/p>\n\n<p><strong>Data Prep Schedule \u2014 <code>product_attributes<\/code> stage added so brand blocks self-populate without the manual rebuild<\/strong>\n* NEW: hourly data-prep cron now runs a <code>product_attributes<\/code> stage between <code>category_hierarchy<\/code> and <code>product_vitals<\/code>. This stage calls the <code>AIEO_InsertCoreProductAttributes<\/code> stored procedure with the operator's configured brand \/ vendor \/ size \/ color attribute taxonomies \u2014 resolving parent <code>brand_id<\/code> from <code>wp_term_relationships<\/code>. The existing <code>propagate_brand<\/code> stage then copies parent \u2192 variations as before\n* Why it matters: brand blocks (<code>aieo\/brand-azindex<\/code>, <code>brand-slider<\/code>, <code>brand-rails<\/code>, <code>brand-related<\/code>, <code>brand-archive-hero<\/code>, <code>brand-story<\/code>) 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 \u2014 the hourly schedule covers the day-to-day case\n* Defensive: the new stage uses <code>information_schema.ROUTINES<\/code> to verify the SP exists before CALLing it \u2014 older installs without the SP get a clean no-op instead of breaking the whole tick<\/p>\n\n<p><strong>Google Reviews \u2014 single-location auto-fallback + clearer empty states<\/strong>\n* NEW: when the <code>aieo\/google-reviews<\/code> block (or <code>[aieo_google_reviews]<\/code> 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 \u2014 they no longer need to pick a slug for every block instance, the block just works\n* 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 \u2014 add one under...\" (when 0 exist) vs \"You have N locations configured \u2014 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\"\n* 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 <code>do_shortcode()<\/code> PHP-template snippet \u2014 so operators on classic themes \/ page builders find the docs without leaving the admin<\/p>\n\n<p><strong>Google Reviews \u2014 shortcodes for non-FSE themes + runtime-only exposure<\/strong>\n* NEW: <code>[aieo_google_reviews]<\/code> shortcode \u2014 wraps the same render path the <code>aieo\/google-reviews<\/code> block uses, so classic themes \/ widget areas \/ page-builder  &hellip;<\/p>","raw_excerpt":"Adaptive productivity, conversion &amp; retention for eshops and content sites. Anthropic\/Voyage AI: messaging, recommendations, attribution, loyalty, &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/192766","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=192766"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/oxfordmetadata"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=192766"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=192766"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=192766"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=192766"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=192766"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=192766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}