=== Rooster One ===
Contributors: oxfordmetadata
Tags: woocommerce, ai, seo, automation, right-of-withdrawal
Requires at least: 6.7
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 11.0.4
Woocommerce tested up to: 10.9
License: GPLv3 or later
License URI: http://www.gnu.org/licenses/gpl-3.0.html

One model of your shop, read by every surface: AI chat, recommendations, SEO, measurement, merchandising, fulfilment. Anthropic Claude + Voyage AI.

== Description ==
# One model of your business. Every surface reads it.

Rooster One is not a bundle of plugins sharing an admin menu.

It builds **one measured model of your business** — every product, page, customer, order and session, scored on a schedule into flat tables. Your SEO, recommendations, audiences, ad ROI and AI assistant all read that same model. That is why they agree with each other, and why the plugin gets *faster* to use as you switch things on: the expensive thinking already happened, off the customer's request.

**Everything is off by default.** It installs beside your current SEO plugin, pixel manager and consent tool and changes nothing until you switch a piece on.

**The free version is a complete product**, not a demo. **Pro** adds the operational half and the separate front-end runtime plugin.

### It reads your site for what it is

* **Shop** — sales and add-to-carts are the measure.
* **Catalogue** — products published but not sold; engagement is the measure.
* **Content** — no WooCommerce; visits, engagement and forms are the measure.

Auto-detected, overridable in one click. Scoring, cornerstones and applicable signals all follow from it.

### You can find all of it

**Ctrl+K** reaches **629 addressable places** — 158 pages plus tabs and anchored panels. **All Features** lists every one, with pinnable favourites. Every page carries a written description of what you can *do* there, and that text feeds the search.
== What the model is made of ==

Computed on a schedule, stored flat. Everything below reads these.

* **Product vitals** — velocity, out-of-stock history, price history, basket role, returns, and a 0–100 demand score.
* **Content vitals** — reach, engagement, freshness and a content-demand score for every post, page and custom type.
* **Customer vitals** — an omnichannel profile: purchases, affinities, lifecycle stage, survey answers, return risk.
* **Session and attribution rollups** — engagement joined to conversion on one session id, with landing page, campaign and five UTMs.
* **Effective prices** — every price rule resolved ahead of time into one row per product per audience.
== Surfaces ==

### AI chat & semantic search
* **Chat widget** on **Anthropic Claude**, grounded in your catalogue — only real, in-stock items with exact links.
* **Semantic search** on **Voyage AI** embeddings across products, posts, pages and terms.
* **A knowledge base you control**, with identity guardrails so it cannot mis-describe you.
* **Chat analytics** — what was asked, how it was rated, which questions found nothing, which chats ended in an order.

### SEO engine
A Greek-aware replacement for AIOSEO/Yoast. Stays gated behind your current SEO plugin until you switch over; read-only importer and head-parity check included.

* Head, canonical, robots, Open Graph, Twitter and JSON-LD, assembled once into a cache.
* **Commerce schema from the model** — `ProductGroup` + `hasVariant`, per-variant colour, `gtin`, brand, shipping and return policy.
* **AI titles and descriptions written against the live SERP.** Drafts await approval, or run on Autopilot.
* **Opportunity grid** — traffic × conversion: hidden gem, intent mismatch, defend, prune.
* **Rank tracking** (optional DataForSEO, under your spend cap).
* Redirects and 404s, slug monitor, static sitemap, robots.txt, alt-text filling, EU Omnibus history, hreflang, **Local SEO**.

### Selling more
* **Recommendations** — up-sell, cross-sell and same-need alternatives from your real sales patterns.
* **Rails you order by drag-and-drop**, block and classic themes, with custom slots.
* **Pricing engine** — role and wholesale prices, brand discounts, loyalty tiers, points, free gifts. Stacked, resolved ahead of time.
* **Merchandising** — swatches, labels, trust badges, payment logos, galleries, layout builder, custom tabs, one master button style.
* **Lift measurement** — the incremental orders and revenue the engine adds.

### Cart, checkout, recovery
* **Side cart**, **sticky add-to-cart**, **wishlist**, **back-in-stock waitlist**.
* **Saved and abandoned carts** — share and resume, cookieless restore that survives CDN caching.
* **Checkout tuning** — distraction-free checkout with A/B assignment, minimum order, Greek τιμολόγιο fields with AADE lookup.
* Full **block and classic parity**.

### Reaching customers
* **Audiences** — top, lapsed, lookalike, abandoned-cart, reactivation, competition entrants. Recomputed nightly.
* **Automated campaigns** — abandoned cart, win-back, birthday, back in stock, post-purchase. Email and web push, quiet hours honoured.
* **Social posts** from your catalogue, **competitions** on any Gravity Form, **surveys** scored into NPS and voice-of-customer.

### Knowing what worked
* **Server-side measurement you own** — Meta CAPI, GA4, Google Ads Enhanced Conversions, TikTok Events API. Deduplicated, sent after the order is saved, with a daily safety net.
* **Consent / GDPR CMP** — first-party banner, Consent Mode v2, proof-of-consent log, cookie scanner.
* **ROI Wizard** — orders, revenue, cost, net, ROAS and ROI by engine, offer, channel, campaign or creative.
* **Ad spend** typed, by CSV, or nightly from Google Ads / Meta / TikTok. **Conversion goals** for non-shops.
* **Insights Chat** — ask your shop questions in wp-admin. Customers pseudonymised, no data export.

### Running the shop
* **Marketplace order import** — Skroutz, Shopflix, eMAG, eFood, Wolt, Etsy, Amazon → native WooCommerce orders. The **catalogue importer** runs it in reverse.
* **Streaming feeds** — Google Shopping and Local, Skroutz, BestPrice, Shopflix, Meta, Amazon.
* **Sixteen couriers** — vouchers, labels, COD, tracking, bulk printing, daily closings. ACS, BOX NOW, Courier Center, ELTA, Γενική Ταχυδρομική, Speedex, DHL Express, FedEx, UPS, USPS, Royal Mail, DHL Paket, Colissimo, BRT, Correos Express, Sendcloud — plus a **manual carrier** for one with no API.
* **Order documents** — invoices, packing slips, proformas, credit notes. Singly or merged across a date range.
* **Delivery economics** — real break-even free shipping from your carrier costs, per-carrier × zone P&L.
* **Operational intelligence** — stock recovery, missing hot sellers, out-of-stock predictor, branch stock, barcode scanning, optional ERP.

### The withdrawal button — Directive (EU) 2023/2673, Greek Law 5317/2026

Every EU distance seller must now give consumers a **prominent, permanently available button** to declare withdrawal electronically. No transition period.

* A real button, for the whole statutory period.
* **14 calendar days from receipt** — computed from delivery, not the order date.
* **Guests included.** An account is offered afterwards, never required.
* No reason, no prior contact, **partial withdrawal** by item and quantity.
* **Acknowledgement on a durable medium** with content, date and time.
* **Cancellation stays distinct from withdrawal** — one you may refuse, the other you may not.
* **Return vouchers** checked by an operator before the customer sees them. Ships **disabled**.

### Content, blocks, Greek market
* **Events** with RSVP and self-registration, **FAQ** accordions, **Store Pages**, **Food & Beverages** option groups, **Google reviews**, **Media Cleanup** that quarantines before it deletes.
* **Dozens of server-rendered blocks** — store, product, recommendation, swatch, brand, category, blog, competition and event, plus Custom Slot regions.
* **Greece and Cyprus** — Greek couriers with daily closings, Greek marketplaces and feeds, **COD by country or courier**, "from X,XX €" labels before a postcode, AADE ΑΦΜ lookup, complete Greek translation.

### Speed and resilience
* Pre-computed into flat tables; the storefront reads single cached rows.
* A thin **front-end runtime plugin** (Pro) serves the storefront even when the admin plugin is trimmed from the request.
* **Self-healing jobs** re-arm after updates, stay dormant until used, and collapse runaway third-party tasks.
* Tables are **never dropped** on update, activation or deactivation — only on explicit uninstall.
== Free and Pro ==

GPLv3. The free version is a complete, working product — not a demo with the useful parts removed.

**Free — everything above except where marked:** AI chat and semantic search, the whole SEO engine, pricing and merchandising, storefront surfaces, measurement and consent, product feeds and the catalogue importer, courier fulfilment across all sixteen carriers, the block library, Ctrl+K — and the complete withdrawal button. That last is a legal obligation for every EU distance seller; charging for it would be a poor thing to do.

**Pro adds the operational half:**

* **The front-end runtime plugin** — serves the storefront without loading the admin half. The biggest speed difference between free and Pro.
* **Marketplace order import** — Skroutz, Shopflix, eMAG, eFood, Wolt, Etsy, Amazon.
* **Attribution and ROI** — dashboard, ROI Wizard, ad-spend connectors, shipping cost against margin.
* **Audiences and campaigns** — audience builder, email and web-push flows, social posts, AI-suggested offers.
* **Customer intelligence** — customer lookup, surveys, cancellations and returns analysis, chat analytics.
* **Insights Chat**, **physical retail and ERP**, **events and competitions**, Action Scheduler cleanup.

Activated by connecting the site to your Rooster One account — no per-feature keys. Everything Pro-locked stays visible, with an explanation of what it does.
== Optional integrations ==

Rooster One runs entirely on your own server. Nothing below is required for the plugin to work — each is an opt-in add-on you enable only if you want that capability, using your own account.

* **Rooster AI credits** (rooster.systems) — powers the AI chat, AI SEO copy and Insights Chat via Anthropic Claude and Voyage AI embeddings, with no per-provider API keys to manage.
* **Recommendations service** (eshop-optimizer.com) — graph-database up-sell/cross-sell analysis of your order history.
* **DataForSEO** — optional keyword rank tracking under a spend cap you set.
* **Ad and measurement platforms** — Google Ads, GA4, Meta and TikTok, each independently selectable.
* **Couriers and marketplaces** — your own carrier and marketplace accounts, for vouchers and order import.
* **Google Places / Search Console**, and **AADE** for Greek VAT lookup at checkout.

== External services ==

Rooster One runs on your own server. It contacts an outside service only in the
cases listed here, and every one of them is either something you switched on or
something you pressed Send on.

**rooster.systems** — our own service. Privacy policy: https://rooster.systems/privacy/

* **Feedback.** When you press Send in the feedback window, we receive your
  message, the category and star rating you chose, the Rooster One screen you
  were on, your site address, an install identifier, and the versions of Rooster
  One, WordPress, WooCommerce and PHP. Your reply address is included unless you
  tick "send anonymously". Nothing is sent if you close the window.
* **Surveys.** When you press Send on the welcome or check-in survey, we receive
  your answers as short codes (never the wording you saw, so English and Greek
  answers can be counted together), your site address, an install identifier, an
  opaque per-person identifier that lets us tell two administrators of the same
  shop apart without telling us who either of them is, the Rooster One version,
  your admin language, and whether the site reports itself as production or
  staging. Your reply address is included only if you leave it in. Closing the
  window sends nothing.
* **Feature usage — Pro and trial only, and off unless you switch it on.** A
  weekly report of which Rooster One controls have been used on this site: a
  control name, a screen and a count. Never an order, a customer, a price, or
  anything typed into a field. A free installation schedules no background task
  and makes no request. Turn it off under Rooster One and the schedule is
  removed on the next admin page load.
* **AI credits.** If you connect a Rooster account, AI chat, AI SEO copy and
  Insights Chat are served through rooster.systems, which relays them to
  Anthropic (Claude) and Voyage AI. Only the text needed to answer is sent.

**No user agent and no browsing history is collected on any of these paths, and
none of them runs on your storefront** — they are admin-only, and the first two
happen only when a human presses a button.

Other services are listed under Optional integrations above; each is off until
you supply your own account details for it.

== Privacy ==

For WooCommerce stores, product recommendations are produced by our graph-database service at https://eshop-optimizer.com. It is **privacy-centric**: you can opt out of sharing product and category names and prices with limited impact on quality, and withhold customer IDs for anonymity. Oxford Metadata Ltd maintains privacy provisions approved by both Google and Facebook — see https://eshop-optimizer.com/compliance.

Hashed PII is never stored or logged raw. Customers are pseudonymised in Insights Chat. Consent is recorded with an IP/UA-hashed proof-of-consent audit log.

== Installation ==

1. Install through **Plugins → Add New** and search for "Rooster One", or upload the plugin zip to `wp-content/plugins/`.
2. Activate it. Nothing changes on your site yet — almost everything ships off by default.
3. Open **Rooster One** in the admin menu. The header shows whether your site was read as a shop, a catalogue or a content site; correct it in one click if it is wrong.
4. Switch on one capability at a time. Each runs alongside your existing tools until you retire them.

Press **Ctrl+K** on any admin screen to find anything.

== Frequently Asked Questions ==

= Do I need WooCommerce? =
No. Rooster One works on content sites and catalogues too, and adapts what it measures: a content site is scored on visits, engagement and form submissions rather than sales.

= Will it conflict with my current SEO plugin? =
No. The SEO engine self-gates behind AIOSEO, Yoast and Rank Math and stays dormant until you explicitly switch it on. There is a read-only importer and a head-parity check so you can compare output before cutting over.

= Do I have to pay for AI to use the plugin? =
No. The plugin is GPLv3 and a great deal of it — the chat, recommendations, the SEO engine and every storefront and pricing tool — runs without any subscription. Features that call a model consume Rooster AI credits.

= What does Pro add? =
The operational half: courier fulfilment and order documents, marketplace order import, attribution and ROI, audiences and automated campaigns, web push, customer intelligence, Insights Chat, physical-retail and ERP tooling, and events and competitions. Pro also delivers the **front-end runtime plugin** — a separate, frontend-only companion that serves the storefront, SEO head, sitemap and redirects without loading the admin half, which is the biggest single speed difference between free and Pro. See "Free and Pro" above for the full split.

= Is the free version crippled? =
No. It is a complete product: the AI assistant, the full SEO engine, the whole pricing and merchandising stack, the storefront surfaces, measurement and consent, and the product feeds are all in the free version. Pro adds operational capability, not the basics.

= Will it slow my site down? =
The design goal is the opposite. Expensive work is pre-computed on a schedule into flat tables and the storefront reads single cached rows, so enabling a feature adds a surface rather than a per-request query.

= What happens to my data if I update or deactivate? =
Nothing is removed. Tables are never dropped on update, activation or deactivation — only when you explicitly uninstall the plugin.

= Is it translated? =
Yes, fully into Greek — admin and storefront — and it is written to be translated: source strings are English and extractable with Poedit.

= Does this make my shop compliant with the withdrawal-button law? =
It gives you the mechanism the law requires: a permanent, prominent withdrawal button that works for guests, a separate confirmation step, partial withdrawal on multi-item orders, and an email acknowledgement recording the content, date and time of the declaration. That is the part software can do.

The rest is yours: your terms of sale, who pays return postage (**Directive 2011/83 article 14** leaves that partly to your terms), and actually processing the declarations and refunds you receive. The plugin will not pretend those are done because a button exists. The feature ships **disabled** for that reason — switch it on when your policy is ready.

= Which law is this, exactly? =
**Directive (EU) 2023/2673**, transposed in Greece by **Law 5317/2026** (published 10 July 2026), which inserts **article 3ζα into Law 2251/1994** on consumer protection. It came into force on publication, with no transition period. Return costs are governed separately, by **Directive 2011/83/EU article 14**.

= Is "cancel my order" the same as withdrawal? =
No, and treating them as the same is the commonest way a compliant-looking implementation fails. Cancelling an unshipped order is a commercial courtesy you grant on your own terms and may refuse once the parcel has left. Withdrawal is a statutory right exercisable for 14 calendar days **from receipt**, which you cannot refuse and whose window you do not set. Rooster One keeps them as two separate flows.

== Screenshots ==

1. Every feature in one catalogue - search 425 tools across 176 screens and open any of them from here.
2. The module grid: turn on only what your shop needs. Each card says what it does before you enable it.
3. Ask your shop a question in plain language and get an answer from your own data.
4. Couriers: print vouchers, track parcels and reconcile what each carrier actually billed you.
5. Withdrawal and returns handled to the letter of EU consumer law: one click for the customer, and a queue that runs from request to refund.
6. Role pricing: wholesale, trade and member prices per customer role, without a second catalogue.
7. Discounts across a whole brand or category, including the monthly-offer CSV import.
8. Customer discount tiers that move with what a shopper has actually spent.
9. Free gifts triggered by basket value, brand or category.
10. Free shipping and cash-on-delivery rules, per country and per payment method.
11. Price history with the EU Omnibus 30-day lowest price recorded on every change.
12. Table rate shipping by weight, value, zone and courier.
13. Marketplace and comparison-shopping feeds, generated and kept current.
14. Catalogue importer: bring products in from a supplier file and map the columns once.
15. SEO health: what is wrong across the catalogue, ranked by how much traffic it costs.
16. The SEO engine: titles, descriptions and indexing rules for every product and category.
17. Product schema that search engines and AI assistants can actually read.
18. Redirects, including the ones a migration would otherwise have left broken.
19. The search queries bringing people to the shop, and the pages they land on.
20. Content opportunities: what to write next, argued from your own search data. (Pro)
21. Storefront display: every customer-facing element in one place.
22. Colour and image swatches on the product page and across the catalogue.
23. AI Chat: Embeddings population. (Pro)
24. A side cart that shows the basket without leaving the page.
25. The Navigator: help shoppers find a product by what they need it for.
26. Performance: which channel, campaign and landing page produced the revenue. (Pro)
27. Units sold online against each physical branch, so you can see where stock belongs. (Pro)
28. GDPR consent, with tags and pixels that genuinely wait for it.
29. Pixels and conversions for Google, Meta and TikTok, measured the same way once.
30. Star ratings analytics: what is rated well, what is not, and what changed.
31. Web push: the opt-in prompt, who subscribed, and what to send them. (Pro)

== Changelog ==


= 11.0.4 - 2026-08-03 =
* **The withdrawal link in an order email now opens the order itself.** It used to land on a form that already knew the order number but asked for the email address the message had just been sent to, and then sent a second email before anything could happen. The link is signed now, so it goes straight to the list of items with nothing to fill in. The signature is tied to that one order and expires on its own, and a tampered link opens nothing.
* **Fixed: the withdrawal button arrived in English on Greek emails.** Order emails are built after WordPress has switched language, and the plugin was not following that switch, so the one piece of wording the law is specific about came out in the wrong language while the text around it stayed Greek.
* **The withdrawal form now disappears once you have used it.** It used to come back under the "check your inbox" message, so customers assumed nothing had happened and submitted it two and three times. The confirmation stands on its own, with a single button for anyone who needs to try a different address.
* **An expired withdrawal link no longer costs you a retyped address.** If the link is genuinely ours but past its date, the page fills in the order's email address for you and asks only that you press Continue. The address is never carried in the link itself, so it stays out of server logs and browser history.
* **Signing in is offered, never required.** When an order was placed with an account, the withdrawal page says so and offers the shortcut, with the full form still working underneath. Customers who are already signed in are pointed to the one-click button in their own orders instead.
* **Fixed: the withdrawal form asked for a reason twice.** A drop-down and a free-text box both carried the label "Reason (optional)", with nothing to say which was meant. The box is now "Other comments", which is what it was always for.

= 11.0.3 - 2026-08-02 =
* **A welcome that explains what you have just installed.** The first time you open Rooster One it says thank you, admits there is a lot in here, and explains why it is one plugin rather than twelve: separate plugins each build their own consent prompt, their own pixel, their own copy of your catalogue, and then quietly disagree about your numbers. It also says plainly what is free and what is Pro. Reopen it any time from the lightbulb icon in the top bar.
* **Tell us about your shop, if you want to.** Four short questions sit folded away under the welcome. Answer them there, or skip and be asked once more a week later, when you have formed an opinion. Skipping costs nothing.
* **A feedback button on every Rooster One screen.** Send a bug, an idea, or something you liked, with an optional rating, without leaving wp-admin. Your address is prefilled so we can reply, and you can send anonymously instead.
* **A support group on Viber**, one click from the top bar.
* **Fixed: the site-profile badge described the maths wrongly.** Hovering "Shop" claimed Opportunities, cornerstone pages and demand scores were "all weighted on revenue". None of the three works that way: Opportunities never reads a money column at all and leans mostly on how often a view becomes a cart, cornerstone pages lead on units sold, and demand is how fast a product is actually selling. The explanation now says what each one really uses.
* **The badge stops shouting how it decided.** It printed AUTO beside the profile on almost every shop, and a label that reads the same everywhere tells you nothing. How the profile was chosen moved into the explanation you get on hover; what stays on the badge is a warning when a profile you set no longer matches what detection sees.
* **Fixed: Greek wording across the new screens.** Among others, the feedback form asked for "Απάντηση σε" — the literal translation of an email header rather than a request for your address.
* **Every button in the admin now has a name, and the manual says what it does.** 421 controls across 118 screens were catalogued and described in plain language: what changes when you press it, whether the customer is emailed, and the exact question it asks before doing anything irreversible. Eight of them contact a customer, and each now says so before you click rather than after.
* **Search finds actions, not just screens.** Ctrl+K and the assistant used to answer "where is X" only. Typing "disavow", "quarantine" or "never suggest" now takes you to the control itself, shown as the screen it lives on followed by the button.
* **A "?" beside a control explains it** and links to the matching page of the manual, resolving to the exact button where one is documented and to its screen otherwise.
* **Fixed: an English-speaking operator on a Greek shop saw a fully Greek admin.** The plugin asked for a translation before WordPress had worked out who was reading, which locked the whole page to the shop's language whatever that person's own account said. Each reader now gets their own language, and two people reading in different languages no longer evict each other's cached copy.
* **Fixed: settings text saved in whichever language you happened to be using.** Fields pre-filled with the built-in wording stored that wording permanently the moment anyone pressed Save, so the text stopped following the reader. Those fields now show the default as a placeholder: leave the box empty and the wording follows each reader's own language.
* **Fixed: in-page tabs are now declared by the screen that draws them.** A hand-maintained list had drifted, advertising a "Migrate from legacy" tab to shops that do not have one. Tabs a shop cannot see are no longer offered to it.
* **Usage sharing, off by default and Pro only.** A licensed shop can choose to tell us which admin controls its own staff use, so we can see which features are worth building on. It records a control name, a screen and a timestamp: never an order, a customer, or anything typed into a field. This is unrelated to your cookie banner and to your shoppers.

= 11.0.2 - 2026-08-01 =
* **Refusing a withdrawal request.** A shop manager can now decline a request that falls outside the right — sealed or pharmaceutical goods opened after delivery, or a request made after the deadline — citing one or more of your own published grounds. The customer is emailed exactly what was ticked. The grounds are yours to edit under the withdrawal settings, prepopulated from a standard returns policy. Refusing is blocked once a return voucher or label has been issued: cancel it with the courier first, so nobody is sent to collect a parcel you have just declined.
* **Every step now shows who did it.** Hover any date in the progress column to see which member of staff took that action.
* **The progress column reads as one clear path**: request received, acknowledgement sent, decision issued, return voucher raised, postage label sent, goods back, money returned. The voucher line appears only when a voucher exists or can still be raised, and says "not yet sent" only while that is still true.
* **Shop managers are guaranteed access to everything.** Access used to depend on the "edit pages" permission, which shop managers normally have but which some sites remove — and when it was removed the whole plugin vanished from their screen with no explanation. Rooster One now uses its own permission, granted to anyone who manages the shop or edits pages. Nobody loses access; shop managers gain it by right rather than by luck.
* The changelog link in the plugin header now points at rooster.systems.
= 11.0.1 - 2026-07-31 =
* **Fixed: the e-shop Manager and AI Chat pages showed programming text where their menu bar should be.** Both pages opened with a block of source code printed across the top and no navigation bar. Nothing was broken behind it and no data was affected, but the two pages could not be navigated from. Home and every other page were unaffected. Please update.

= 11.0 - 2026-07-31 =
**From this release our version follows WooCommerce**, so the number tells you which WooCommerce this was built and tested against. While WooCommerce is on 11.0 we ship 11.0, 11.0.1 and so on; when they move to 11.1 we go to 11.1.0.

* **The WordPress sidebar and the toolbar now list what the plugin does.** Both carry the twelve main sections instead of internal page names, each in its own colour, and each opens Home filtered to just that section. Clicking a section in the top pill bar does the same, so all three menus answer the same way. Tapping a section on a tablet now works too, where a hover menu never could.
* **Bot protection (reCAPTCHA v3) has its own page**, listed directly under Registration and sign-in rather than hidden at the bottom of the sign-in settings. It is findable by searching "reCAPTCHA", "captcha", "bots", "spam" or their Greek equivalents.
* **Ctrl+K no longer offers the same destination twice.** 47 duplicate or dead entries removed, including ten that pointed at cards which no longer exist.
* **The Analyses menu is in Greek.** Every report page in it rendered in English because its labels were translated before the language file had loaded.
* **Greek corrections**: "Slug" read as the animal, warehouse stock read as stock-market shares, Settings and Preferences had collapsed into one word, and "parent product" was said three different ways.
* Menu spacing, pinned shortcuts and section colours are consistent across all three admin pages, which now share one menu bar and one sticky header instead of separate copies.
* Removed the links inviting you to buy your own Anthropic and Voyage API keys. AI runs on Rooster One credits.

= 10.3 - 2026-07-30 =
* **Customers can see where a withdrawal stands.** Entering an order number and email now shows the stage — received, approved, items on their way back, refunded — and what happens next at each one.
* **How the refund was made is recorded and told to the customer**: back to the original payment method, bank transfer, store credit or cash.
* The guest withdrawal link now lasts **21 days** instead of an hour, and a lapsed one can always be re-requested from the form.
* **Greek admin fixes**: menu entries that rendered in English now translate, and five withdrawal strings that read "cancellation" say "withdrawal".
* Minimum WordPress is now 6.7.

= 10.2 - 2026-07-29 =
**Withdrawal declarations now notify the shop, plus mobile-navigation refinements and minor fixes.**

* A declaration that needs processing no longer ends at a private order note: an optional interim order status **"Withdrawal requested"** (off by default — mind anything that reads order statuses), and a **store email** built as a real WooCommerce email with its own recipients and overridable template. Both controlled from Operations → Withdrawal Right → Settings.
* Mobile navigator: **Categories | Filters** tabs at the top of the panel on archive pages, so categories are never buried below the filters.
* Subcategory chips: the mobile slider now shows the same progress affordance as the product carousels — an accent-coloured thumb over a thin black line running to the screen edge — and one theme override recolors both.
* Minor fixes: admin checkboxes that could be ticked but never unticked, Wide/Full block alignment on the chip strip, and dual-bundled class loading hardened against cold-opcache redeclare fatals.

= 10.1 - 2026-07-29 =
**The withdrawal right, end to end — declaration, approval, return label, refund — plus ten international courier drivers.**

**The withdrawal button (Directive (EU) 2023/2673 / Greek Law 5317/2026)**
* A permanent, prominent **withdrawal button** that works for guests, requires no reason and no prior contact, and stays available for the whole 14-day statutory period counted **from receipt**.
* **Partial withdrawal** on multi-item orders — the customer picks which items and how many of each.
* An **acknowledgement email on a durable medium** recording the content, date and time of the declaration, now always sent **in the shop's default language** rather than in whatever locale the request happened to carry.
* Creating an account is **offered after the fact and never required**. Requiring one is the obstacle the law prohibits; the checkbox stays opt-in. Where an account is created, the customer always gets a way into it — a magic link, or a standard set-password email if the link cannot be issued.
* **Instant cancellation is now optional and precisely bounded.** Set the courtesy window in hours *and* minutes — 0 hours 15 minutes is a valid answer — or switch the offer off entirely. Shops that do not want to advertise cancellation no longer have to.

**Return vouchers, with an operator between the carrier and the customer**
* New **awaiting-approval** stage. The operator picks the courier, issues the voucher, **downloads and checks the label**, and only then approves it — at which point it reaches the customer by email and in their account. Nothing carrier-generated reaches a customer unseen.
* **Editable pickup address.** The parcel can be collected from the customer's work address instead of the delivery address. The destination — your own shop — is not editable, because carriers already know it.
* **Upload a label printed elsewhere.** A voucher booked at the courier's own portal can be uploaded and shared exactly like an API-issued one, which is how most shops actually work.
* The return-courier picker offers only the carriers you have flagged as handling returns — a courier that delivers is not automatically one that collects.
* **Who pays for the return** is an explicit setting, because Directive 2011/83 article 14 leaves it partly to your terms. Nothing is issued until you have answered it.

**Ten international courier drivers**
* **DHL Express, FedEx, UPS, USPS, Royal Mail, DHL Paket, Sendcloud, Colissimo, BRT (Bartolini)** and **Correos Express**, each a real API integration built on a shared transport layer — OAuth, label decoding across PDF, PNG, JPEG, GIF and ZPL, and carrier-specific error extraction.
* Carriers that cannot bill a third party do not show a "who pays" control, because offering a choice that changes nothing is worse than offering none.
* BRT, Correos Express and Colissimo issue per-customer endpoints, so their base URL is a setting with a sensible default rather than something only a plugin release can change.
* The courier screen now separates **set up with an API**, **set up for manual use**, and **available but not set up**, and badges what each carrier is configured for.

**Fixes**
* The web-push first-visit opt-in banner no longer defaults to on, and this update switches it off once. Turn it on in **Operations → Web Push → Display** if you want it. Existing subscribers keep receiving campaigns either way.
* Admin submenus no longer vanish while the pointer crosses the gap towards them.
* The withdrawal queue's stage counters kept their styling on every tab, including empty ones, and each stage now has its own colour.
* A DHL Paket billing number assembled from an incomplete customer number could be accepted **against another account**. An incomplete number is now refused outright.
* Courier settings are merged rather than replaced on save, so ticking one option no longer blanks the rest.


= 10.0 - 2026-07-27 =
**Everything in the plugin is now findable, described and correctly named — in English source and in Greek.**

**Find anything**
* Every one of the 617 addressable destinations — 157 pages, 25 in-page tabs and 435 anchored panels — is reachable from **Ctrl+K** on any admin screen.
* All 195 pages and tabs now carry a written one-line description of what you can *do* there. Hover any destination for a styled explanation; sections inside a page say which page they belong to instead of borrowing its text.
* Descriptions feed the search index, so a destination is findable by the nouns it deals in ("ΑΦΜ", "Omnibus", "packing slip", "disavow") and not only by its label.

**Know what kind of site Rooster One thinks you are**
* The admin header now shows your site profile — shop, catalogue or content — whether it was auto-detected or set by you, and warns when a manual setting no longer matches the evidence. One click to change it.

**Translation**
* Every source string in the codebase is now English. 151 Greek literals across both plugins were converted, with the Greek preserved exactly as translations, so nothing a shopper reads changed.
* Duplicate translations of the same concept were merged onto single strings, and the admin navigator's ↵ hint no longer reads "open" as an adjective.
* Four checkout invoice fields in the runtime plugin had never been translatable at all and now are.

**Fixes**
* OpenAI was dropped as a provider in May, but the AI settings form could still store it: the dropdowns stopped offering it while the save handler kept accepting it, so a stale submission could switch a live site onto an unsupported provider. The form now writes only Anthropic and Voyage.
* The AI credits check told operators the Content Connector was not configured even when it was — that message is only reachable *after* the token authenticates. It now distinguishes "no Anthropic key on the account" from "AI service disabled", names the account and links to the portal.
* Admin hero copy no longer quotes one particular shop's catalogue size as if it were yours, and no longer claims there are no restrictions.

= 9.5 - 2026-07-27 =
**Your data stays put on update, timings follow your shop's clock, and audiences resolve to real people.**

**Nothing is deleted by an update any more**

* Updating or deactivating the plugin no longer drops a single database table. Deactivating from a **multisite network** screen previously dropped twelve working tables along with your live sessions and session archive — on one test store that was over 900,000 archived rows. Table teardown now happens in exactly one place: uninstalling the plugin.
* Two schema migrations used to destroy live data whenever they ran. Updating could empty the lifetime "has ever bought" rollup — which silently made every purchase-history audience match **nobody** until the next nightly rebuild, so campaigns aimed at past buyers sent to an empty list — and any survey schema change discarded every stored Gravity Forms response, including NPS and free-text feedback. Both now migrate in place and keep your rows.
* Uninstalling now cleans up properly and completely: tables, stored routines, options, transients and scheduled jobs, across every site on a multisite network. Set `aieo_preserve_data_on_uninstall` if you remove the plugin for any reason other than a real decommission.

**Times and dates follow your WordPress timezone**

* Report windows such as "this month" now use the timezone set in **Settings → General**, not the server's clock. If your host sits in a different timezone from your shop, monthly figures previously started and ended at the wrong moment; on a server hosting several shops in different countries, no single clock could be right for all of them. Daylight saving is handled per date.
* Several timestamps were stored in the server's local time while the values beside them were stored in GMT, which made cached entries look newer than they were and could sort them incorrectly.
* The sales predictor now decides "the last day we had sales" using your shop's calendar day. On a store in a timezone ahead of GMT, orders placed shortly after midnight counted as the previous day, which could make the predictor treat an active shop as dormant.

**Marketplace orders**

* Two WooCommerce orders could be created from a single marketplace order — seen with Skroutz, possible with any connected marketplace — when a delivery arrived twice and the first import had not finished. Imports now claim an order before creating it, so a repeat delivery joins the existing order instead of duplicating it. An interrupted import releases its claim automatically.

**Finding things**

* The Quick Navigator (Ctrl/Cmd+K) now shows each item's real menu location, no longer lists the same page twice, and displays "&" correctly instead of "&amp;".
* Recommendation caches are now cleared after a WordPress core upgrade. The routine existed but had never once run, because it looked for a table under the wrong name.
* Removed a duplicated, four-month-stale second copy of the marketplace importer. Files removed by a release are now deleted on activation, so installs updated in place do not keep them.

**From the earlier 9.5 work**

* Segment and cohort CSV exports no longer download empty files. Nine of fourteen targetable audiences — including VIP, Loyalist and Brand-Devoted — silently exported zero rows because the export filtered on the dormancy column for every name. One resolver now serves every caller.
* New retroactive identity backfill links past orders to the people who placed them: Data Pipeline → Identity resolution, `wp aieo identity backfill`, or a daily job. Safe to re-run as often as you like.
* Three additional points where a visitor is identified: registration, WooCommerce customer creation, and checkout.
* Fixed an Action Scheduler query guard that truncated the plugin's own health probe, making the Signals screen report existing tables as missing.
* Data prep schedule and Product/Orders analytics merged into one Data Pipeline page; Signals moved to its own page.

= 9.4 - 2026-07-23 =
**Correctness hardening for the faster price lookup introduced in 9.3.**

* **Fixed: the faster price lookup could show the wrong price on a multi-currency store.** Currency plugins that convert prices after WooCommerce has gathered them — including WooCommerce Multilingual — were not detected, so a shop could display an unconverted price. The check now recognises them and falls back to the slower, always-correct calculation whenever any pricing extension is involved.
* **Fixed: the same lookup could show a stale or truncated price.** WooCommerce keeps a summary of each variable product's price range, and that summary can fall behind if prices are imported without it being refreshed, or be misread when a price is stored with a comma as the decimal separator. The price shown is now cross-checked against the product's own variations, and anything that disagrees falls back to the full calculation.
* **Fixed: prices stored with comma decimals are now read correctly.** On European stores a price saved as "24,99" could be read as 24.00 by parts of the system that read the database directly, understating the price. Values are now interpreted using the store's own number format.

* **Fixed: deleting a colour or size no longer leaves stale swatches behind.** Removing an attribute term did not refresh the products that used it, so their swatches could keep showing the removed option until each product was next saved. Deletions now refresh the affected products, as edits already did.
* **Faster attribute edits during imports.** Editing attribute terms — which product imports do constantly — used to run one database query per affected variation. The affected products are now found in a single query and refreshed once per import run rather than once per edit.

= 9.3 - 2026-07-22 =
**Faster variable-product pricing, and correct prices for professional customers after a price import.**

* **Fixed: professional customers could see outdated prices for up to 30 days after a role-price import.** WooCommerce caches the price range of a variable product, and the cache key recorded who was viewing but not which version of the role-price data was in force. Uploading a new role-price CSV therefore left professionals on the previous cached prices until each product happened to be re-saved. The role-price data version is now part of the key, so an import takes effect immediately. Public prices are unaffected and their caches are left intact.
* **Faster storefront pages for logged-in customers.** The same cache key was being varied by every role a customer holds, including roles that have no effect on price at all — so ordinary customers, loyalty members and newsletter subscribers each caused the shop to recalculate a variable product's price range from scratch, arriving at exactly the same answer as for a logged-out visitor. The key now varies only by the roles that actually change the price, so those customers share the public result.
* **Faster recommendation and side-cart cards.** Building a card for a variable product meant loading every one of its variations to work out the price range — on a product with 150 variations that is substantial work, repeated per card. Where it is safe to do so, the range now comes from the index WooCommerce already maintains for exactly this purpose. Products with role-based pricing, and stores that display tax-inclusive prices, keep the previous behaviour.
* **Fixed: prices shown in product labels and structured data ignored tax display settings.** Discount labels and the price range published in structured data were built from raw prices rather than the prices shoppers actually see, which on a tax-inclusive store meant both were understated. They now match the displayed price.
* **Reduced repeated settings lookups on price-heavy pages.** The plugin's settings tree was being rebuilt from scratch on every internal lookup, which on a large variable product could happen several hundred times in a single page render. It is now built once per request.

= 9.2 - 2026-07-21 =
**Analytics and nightly jobs now repair their own database routines.**

* **Fixed: nightly jobs could fail forever after a site restore or migration.** Database backups exclude stored routines unless explicitly asked for, so restoring a site could silently drop the procedures that power surveys, web-push customer intelligence, product needs and session analytics — while the plugin still believed they were installed. The affected jobs then failed every night with "PROCEDURE … does not exist", and reinstalling or reactivating the plugin did not help, because the check was based on a stored version number rather than on whether the routines actually existed.
* **Now self-healing.** Each job detects a missing routine at the moment it needs it, reinstalls it and retries once. This costs nothing on normal page loads — there is no extra check on storefront requests — and it repairs itself inside the nightly job or an admin action instead of needing manual intervention.
* Covers the survey ingest/intelligence procedures, the web-push customer-intelligence recompute and segment assignment, product-needs population, and the session-analytics aggregation, ranking, summary and cleanup routines.

= 9.1 - 2026-07-20 =
**Stability release — three fixes worth updating for, one of them urgent.**

* **Fixed: a fatal error that could break logging in.** On sites using the identity/attribution layer, the `wp_login` handler called an internal helper it wasn't allowed to reach, which raised a PHP fatal during sign-in — affecting the standard login form, "My account", and passwordless/magic-link sign-in. If you were seeing 500s on login, this is the fix.
* **Fixed: AI credit balance over-reported when you held a top-up.** The remaining balance added your top-up on top of the monthly cap, but the cap already includes it — so the figure could read as much as double. This under-fired the low-balance alert and let the assistant hit its limit while the meter still showed credit. The credit meter now reads "incl. $X top-up" rather than "+ $X" to match how the cap is actually composed.
* **Removed a latent fatal on the paid-order path.** The Meta CAPI purchase-event builder contained an unreachable branch that would have raised the same class of fatal as the login bug if ever taken. Removed rather than left as a landmine.

= 9.0 - 2026-07-20 =
**The plugin is now Rooster One.**

* **New name.** "AI eShop Optimizer" is now **Rooster One** (the front-end companion is "Rooster One — Runtime"). Only the display name changes: your settings, data, shortcodes and block names are all untouched, and updating is a normal plugin update with nothing to reconfigure.
* **One checkout newsletter opt-in instead of two.** A single box now registers new subscribers, with per-list control for shop managers, and customers manage newsletter and offers independently from their account.
* **Tidier checkout birthday field** — day, month and year sit on one row with a full-width explanatory note and a configurable highlight colour.
* **Accessibility fixes** — corrected ARIA usage on rating stars and gave promo and product-card links proper accessible names.
* **Faster perceived loading on category, page and blog pages** — the above-the-fold hero image is now prioritised, improving Largest Contentful Paint. Below-the-fold heroes stay lazy.

= Earlier versions =

The complete history — every release back to 1.0 — ships with the plugin in `changelog.txt`, and is on the site at https://rooster.systems/get-aieo/changelog/

== Upgrade Notice ==

= 11.0.4 =
Recommended for any shop using the withdrawal right. The link in an order email now opens the order itself: it used to land on a form that already knew the order number but asked for the email address the message had just been sent to, then sent a second email before anything could happen. The link is signed, so the customer sees their items straight away. Also fixes the withdrawal button arriving in English on Greek emails, stops the form reappearing after you submit it (which had customers sending the same request two and three times), and renames the second "Reason (optional)" box to "Other comments".

= 11.0.3 =
Recommended for everyone. The first time you open Rooster One after updating it now explains what you have installed and why it is one plugin rather than twelve, with the free/Pro split stated plainly; a short optional survey sits folded underneath. Every Rooster One screen gains a feedback button and a link to our Viber support group. Also corrects the site-profile badge, which claimed Opportunities, cornerstone pages and demand scores were "all weighted on revenue" — none of the three works that way, and the explanation now describes what each actually uses.

= 10.1 =
Recommended for every shop selling at a distance in the EU. Adds a complete withdrawal-button implementation for **Directive (EU) 2023/2673** — in Greece, **Law 5317/2026**, in force since 10 July 2026 with no transition period: a permanent button that works for guests, no reason and no prior contact required, partial withdrawal on multi-item orders, and an acknowledgement email on a durable medium in your shop's own language. Return vouchers now pass through an operator who checks the label before the customer ever sees it, the pickup address is editable, and labels printed at a courier's portal can be uploaded. Ten international courier drivers added — DHL Express, FedEx, UPS, USPS, Royal Mail, DHL Paket, Sendcloud, Colissimo, BRT and Correos Express. **The withdrawal feature ships disabled**; switch it on once your returns policy and terms are ready. Also fixes a DHL Paket billing number that could be accepted against another account, and courier settings being blanked on save.
= 10.0 =
Recommended for everyone. Adds a searchable index of every screen in the plugin (Ctrl+K from anywhere), a written description on every page and tab, and a site-profile badge in the header showing whether Rooster One reads your site as a shop, a catalogue or a content site. All source strings are now English with the Greek preserved as translations, so nothing your customers see changes. Also fixes a bug where the AI settings form could still store OpenAI — a provider dropped in May — and corrects a misleading AI-credits message that sent operators to re-check a connector that was already working.
= 9.5 =
Recommended for everyone, and important if you run on multisite or host several shops on one server. Updating or deactivating no longer drops any database table — a network deactivation previously discarded twelve working tables plus your live sessions and session archive, and two schema migrations could empty the purchase-history rollup or your stored survey responses on update. Report windows such as "this month" now follow the timezone in Settings → General rather than the server clock, so figures no longer shift when your host is in a different timezone from your shop. Also prevents a single marketplace order being imported as two WooCommerce orders. Recommendation caches are cleared once on upgrade, so expect a brief cache-miss on product pages immediately afterwards.

= 9.2 =
Recommended if your site has ever been restored, migrated or cloned. Database backups omit stored routines by default, which could leave the surveys, web-push, product-needs and session-analytics jobs failing every night with "PROCEDURE … does not exist" — permanently, since reactivating the plugin did not rebuild them. Those jobs now detect and repair their own routines, with no added cost on storefront requests.

= 9.1 =
Recommended for everyone. Fixes a PHP fatal that could break sign-in (login form, My account, and magic-link) on sites using the identity/attribution layer, corrects an AI credit balance that over-reported when a top-up was held, and removes a latent fatal on the paid-order path.

= 9.0 =
The plugin is now called Rooster One. Display name only — settings, data, shortcodes and block names are unchanged, and there is nothing to reconfigure. Also: one unified checkout newsletter opt-in instead of two, a tidier birthday field, accessibility fixes on ratings and promo links, and faster Largest Contentful Paint on category, page and blog heroes.

= 8.7 =
Makes more of Rooster One's native blocks (Recommendations, Product Slider, Product Variations Gallery) discoverable in the block editor and on the plugin page, documents the full block library, and clarifies the "Post Related Product Categories" block name. No front-end changes.

= 8.6 =
New: an in-chat SEO Auto-Fix Assistant with Google Search Console plus backlinks & disavow, a sharper and more relevant storefront assistant, and lower embedding costs. Much faster nightly Data Prep, vitals and analytics queries — no more billion-row scans or midnight swap spikes — and more resilient under heavy crawling. Note: the consent cookie scanner now defaults to off — rebuild the inventory on demand via "Re-scan storefront now".
