== Changelog ==

This file contains the full release history of BrikPanel. The latest releases are kept in readme.txt; older versions are archived here.

= 3.1.45 (2026-06-27) =
* Fix: **The "Screen Options" and "Help" buttons are no longer hidden on the orders screens**. WordPress tucks those toggles into the very top-right corner, exactly where BrikPanel's bars sit, so they ended up hidden behind them. On the single order screen they now live inside the sticky header next to the status and Save button; on the orders list they sit next to the "Add order" button. Either way they open the same panel as before, fully visible. On tablets and phones they shrink to compact icons so they stay reachable without crowding the bar. Works on both simple and variable product orders

= 3.1.40 (2026-06-27) =
* Improvement: **Marketplace sales now count in Revenue and Net profit**. On stores that use BrikMarket, the headline Revenue, Total Sales, Cost of goods and Net profit now include your marketplace turnover (Trendyol, Hepsiburada and the rest) together with your website orders, so the dashboard reflects the whole business instead of showing your revenue as zero while the marketplace cards held all the sales
* Fix: **The Profit section no longer shows a permanent loss after you add product costs**. Cost of goods was counting your marketplace orders' costs while Revenue did not count their sales, so the moment you filled in a product cost the store looked like it was losing money. Revenue and Cost of goods now cover exactly the same orders, on both simple and variable products, so profit and margin are correct. The Google Sheets profit report uses the same basis
* Improvement: **Conversion rate and visitor stats stay website-only**. Orders, average order value, conversion rate and visitors keep counting only on-site activity (marketplace orders have no website visit), so your conversion rate stays accurate even though the money figures now include the marketplace. A separate fix means marketplace orders are now reliably recognised for this split on High-Performance Order Storage stores
* Fix: **Marketplace revenue is converted to your store currency**. The per-marketplace sales totals are now converted to your base currency before being added up, matching the rest of the dashboard, so a store selling in more than one currency no longer mixes raw amounts together

= 3.1.39 (2026-06-26) =
* New: **Add images to the product description**. The description editors (both the long description and the short description, on simple and variable products) now have an "Insert image" button that opens your media library. You can set the image's alt text, its alignment (None, Left, Centre or Right) and its size (Small, Medium, Large or Full, that is roughly a quarter, half, three-quarters or the image's natural width). Click an image you have already inserted to change its alignment, size or alt text, or to swap it for another. No more closing BrikPanel to add a picture with the classic editor
* New: **Open description images in a lightbox**. While inserting or editing an image, tick "Open in a lightbox when clicked" and that image opens in a clean full-screen overlay on the product page when a shopper clicks it (click to enlarge, then close with the backdrop, the X button or the Esc key). The small lightbox script only loads on product pages that actually use it, so storefront performance is unaffected
* Improvement: **Keep typing straight after inserting an image**. The cursor is now placed right after a newly inserted image, so you can carry on writing without having to click back into the editor

= 3.1.38 (2026-06-25) =
* Fix: **Google Sheets product sync no longer creates duplicate rows for variations (or any product)**. When a stock or price change was pushed but the plugin had lost track of which sheet row a product lived on, for example after a network hiccup dropped Google's reply or an earlier full sync was interrupted, the next push could add a second row for the same item. The push now reconciles against the Product ID already in the sheet and updates that existing row instead of appending a duplicate. Variations and their parent product are protected the same way. Run "Sync now" once to clear any duplicate rows a previous version left behind

= 3.1.36 (2026-06-22) =
* New: **The product editor's attributes and variations section was redesigned**. The card now has a clean header (the "Variable product" title, a short description and the toggle) above a tidy body, matching the rest of the editor, instead of the previous stacked grey text. The plain attribute drop-down is replaced with a modern, searchable picker: click the field, type to filter your global attributes, and press Enter to add the match. The free-text "add a value" box and its Add button are now one joined input, and the "Size and Color" shortcut moved into a clear "Quick add" chip. Every action behaves exactly as before, on both simple and variable products
* New: **Drag to reorder attribute rows**. Each attribute row now has a drag handle, so you can reorder your attributes the way WooCommerce does. Because the order decides how variation names are built, reordering marks any already-generated variations as needing a refresh and prompts you to regenerate them
* Fix: **WooCommerce's "Customer history" and "Order attribution" boxes are back on the modern order screen**. Both boxes carry useful native data and were being hidden by mistake; they now show with BrikPanel's card styling. Only the raw "Custom Fields" box (already replaced by BrikPanel's "Additional details" card) and the download-permissions box stay hidden
* Fix: **The "Order actions" box no longer looks broken with the CURCY multi-currency plugin**. CURCY adds a currency selector and a note to that box; the selector now sits on its own full-width row with the note as small helper text underneath, and the Trash and Update buttons line up correctly. Stores without CURCY are unchanged
* Improvement: **Security and reliability hardening of the attributes and variations editor**. The data the editor embeds in the page is now safely encoded so attribute or term names imported from elsewhere can never break out of the script, saving and the variation preview now run a per-product permission check, and creating a new term or global attribute is limited to users allowed to do so. Removing a taxonomy attribute from a product now cleans up its old term links, a sensible upper limit guards against a runaway number of variations, and several smaller fixes make the variation preview race-safe and stop duplicate attribute rows. Works on both simple and variable products

= 3.1.32 (2026-06-21) =
* New: **Third-party plugin meta boxes now live in the "Visible editor sections" list**. The separate "Third-party plugin meta boxes" picker is gone. Every meta box BrikPanel finds (SEO plugins, Germanized, WPCode, custom boxes and so on) now appears as a row in the same section list, marked "Plugin" and hidden by default, so you can switch it on and drag it to any position with the native sections. The editor then renders that box in the exact spot you placed it, for example between Price and Cost of goods. Your earlier selections are migrated across automatically. Works on both simple and variable products
* New: **Set cost (COGS) from the Products bulk update**. The bulk update action now has a Cost option that writes the cost of goods to many products at once, mirrored to WooCommerce's native COGS field where available. Like price, it applies directly on simple products and to every variation on variable products, and can be narrowed to matching variations with the attribute filter. Leaving the value empty clears the cost
* New: **"Fix store visibility (after import)" bulk action**. After a CSV or Excel stock import, products that are in stock could stay hidden on the storefront because the importer wrote the stock value without updating WooCommerce's visibility data. A new Maintenance action in the Products bulk update scans the whole catalogue and realigns each product's "out of stock" visibility flag and lookup data with its real stock status, re-syncing variable products from their variations first. No more toggling a product off and on to make it reappear
* New: **Paste tables into the product description**. Pasting content that contains a table into the description editor now keeps the table, including merged cells, instead of flattening it to plain text. The table also renders with clean borders in the editor and saves intact. Works on both simple and variable products
* Improvement: **Third-party "Additional product data" sections now match the BrikPanel design**. Extra product-data sections added by other plugins are forced onto BrikPanel's clean style: the red accent bar that the CURCY currency switcher drew beside its price fields is gone, and add-on builders that paint their own brand colours (such as the AcoWebs product add-ons) are normalised to BrikPanel's neutral palette, headers and inputs
* Improvement: **A much better experience on phones and tablets**. The dashboard no longer scrolls sideways on a phone, and its help tooltips and Profit cards stay tidy and readable. The top bar no longer overlaps its own logo and search button. The classic (re-skinned WordPress) menu now opens cleanly in the mobile drawer, with no icons sitting on top of the text and submenus that expand in full. The whole menu is now reachable on tablet-width windows (between 783 and 960 pixels wide), where it previously could not be opened at all. The BrikPanel settings page no longer overflows sideways on a narrow screen
* Fix: **"Additional product data" no longer shows unrelated fields**. With a multi-currency plugin in fixed-price mode, surfacing the per-currency price fields was accidentally running other plugins' field hooks too, so unrelated fields could leak into the card even when nothing was selected. The multi-currency prices now appear in their own small section and nothing else is pulled in. Works on both simple and variable products
* Fix: **WPML: the Products list is no longer empty when your admin language has no translated products**. On a WPML store whose catalogue is in one language while your admin language is set to another, the modern Products list could show nothing while the tab counts still showed the full total. The list is a store-management screen, not a translation workflow, so it now shows your whole catalogue regardless of the selected admin language, matching the counts. Product saving is untouched, so each product keeps its own language
* Fix: **Your custom brand logo now applies as soon as you set it**. Choosing a logo under Appearance previously also required ticking a separate checkbox, which was easy to miss, so the logo was silently ignored. The logo now turns on automatically when you set it and off when you remove it, and the extra checkbox is gone. A duplicate "ghost" logo that could appear at the very top of the modern login page is fixed at the same time
* Fix: **The dashboard "With Marketplace" label no longer pushes the filters onto a second line**. When the marketplace add-on is active, that label is now shown as a small line under the title instead of widening the heading, so the date and export controls stay on the same row

= 3.1.31 (2026-06-17) =
* Fix: A selected third-party plugin meta box (the "Additional fields" card in the product editor) could render with no background, border or shadow on some sites. The card now keeps its styling even when another plugin moves or restyles the meta box area

= 3.1.29 (2026-06-16) =
* New: **Percentage-based expenses**. Add a cost as a percentage of revenue (for example a 2.9% credit-card or marketplace commission) and it is calculated against your sales for every period automatically, shown on its own line in the Expenses breakdown
* Improvement: **The expense "Category" field is now "Title"** — clearer for naming a one-off cost
* Improvement: **Operational Expenses sits under the "More" menu** in the BrikPanel sidebar when the Suppliers module is off, instead of taking its own top-level slot
* New: **Add an expense straight from the dashboard**. The Profit section's Expenses card now has a quick "+" button that opens a small form (amount, category, date, repeat, note), so you can log a cost without leaving the dashboard. It saves to the same place as the Operational Expenses page
* New: **Recurring expenses now repeat automatically**. Mark an expense as Monthly, Weekly or Yearly and it is counted in every period from its start date onward, all on its own. No more adding rent or payroll by hand each month. Existing entries are left exactly as they were
* Improvement: **The Operational Expenses page is now always reachable**. Previously it only appeared while the Suppliers module was enabled, even though the expenses you logged still affect the dashboard's Net Profit. It now stands on its own as an "Expenses" item in the BrikPanel sidebar when Suppliers is off, and stays grouped under Suppliers when that module is on. Same page, same data, just no longer hidden
* Improvement: **The Expenses breakdown now itemises your real expense categories**. Instead of lumping everything into a single "Other" line, the breakdown lists each category you logged (for example Salaries, Rent, Shipping carriers, Packaging) alongside ad spend, tax and supplier/stock costs, so you can see exactly where the money went
* Fix: **Storefront Revenue and Total Sales no longer read as $0 on stores using the marketplace add-on**. An order-exclusion query could, in some setups, drop every order and zero out the figures; this is now computed correctly
* New: **Returns and Coupons in the dashboard Profit section**. Revenue is now shown net of customer refunds for the period, so your margin reflects money you actually kept, and a new expandable breakdown on the Revenue card spells it out: Gross sales, Returns, Net revenue, plus how much you gave away in coupon discounts. Net profit updates accordingly. Works on both simple and variable products
* New: **Clearer Profit tooltips**. Revenue, Cost of Goods, Expenses and Net Profit each have a help icon explaining exactly how the figure is calculated, including that taxes are part of Expenses and that administrator test orders are left out
* New: **Choose which Profit fields to show**. Under WooCommerce > Settings > BrikPanel you can hide Cost of Goods, Expenses, Returns or Coupons if your store does not use them. Revenue and Net Profit are always shown. Hiding a field only removes it from view; it is still factored into Net Profit where it is a real cost, so the number stays accurate

= 3.1.28 (2026-06-15) =
* New: **Early access to BrikMentor**. Once your store passes 100 completed orders (and again at 200 if you dismissed the first one), BrikPanel invites you to join the private beta list for BrikMentor, a separate AI assistant and email marketing platform for your store that is in the works. There is also a small, dismissible "BrikMentor is coming" card at the bottom of the dashboard, and a permanent "BrikMentor early access" option at the bottom of WooCommerce > Settings > BrikPanel, so you can join at any time, even before that milestone. Joining is entirely optional: you type your email and tick a consent box, and you can answer one optional question about which marketing tool you use. Nothing is sent unless you fill in the form and consent, the invite never appears again once you join or after the final milestone, and you can unsubscribe at any time. Your submitted email is stored locally and delivered reliably with automatic retries, so it is never lost; if your host blocks the connection entirely, a WhatsApp button appears so you can still request access directly. See "What data does BrikPanel send outside my site?" in the FAQ
* Improvement: **The review request is now shown less often**. The earlier 14-day review prompt was removed; BrikPanel now asks for a review only after 50 completed orders, a much stronger sign the plugin is actually helping your store

= 3.1.27 (2026-06-15) =
* Improvement: **Per-currency prices from CURCY now appear automatically in the product editor**. When the CURCY (Currency Switcher for WooCommerce) plugin is set to "Fixed Price" mode, it adds a price box for each extra currency. Those boxes are attached to WooCommerce's native price fields, which the BrikPanel editor only shows for sections you pick by hand, so they were easy to miss. BrikPanel now detects CURCY's fixed-price mode and surfaces those per-currency price fields on its own: on simple products (in the product-data section) and on every variation row (open the variation's "more fields" arrow). Type a price per currency, save, and it is written straight to CURCY's own data, so the storefront shows exactly what you entered. If you prefer CURCY's automatic exchange-rate mode instead, there is nothing to enter and the dashboard still converts every order to your store currency. Works on both simple and variable products. Reported by a user on wordpress.org

= 3.1.26 (2026-06-15) =
* Improvement: **Product fields from more third-party plugins now appear in the BrikPanel editor with their proper name**. Plugins that add a "Product data" tab the older way (such as Estimated Delivery Date Per Product For WooCommerce) were already detected, but their section showed an unfriendly internal name. BrikPanel now reads the plugin's real tab title, so the section reads correctly (for example "Product Est Date"). As before, pick which of these extra sections to show under WooCommerce > Settings > BrikPanel > Products. Works on both simple and variable products, including per-variation fields. Reported by a user

= 3.1.25 (2026-06-15) =
* Improvement: **Multi-currency conversion now also covers the Segments and Orders screens**. Version 3.1.22 converted the main dashboard to your store currency; this release extends the same day-of-sale conversion to the Segments screen (the Orders tab's Total Revenue and Average Order Value, and the Customers tab's per-customer spend) and to the revenue summary above the Orders list. As before, each order is converted using the exact rate from a multi-currency plugin such as CURCY (Currency Switcher for WooCommerce) on the day of sale, falling back to the manual rate under WooCommerce > Settings > BrikPanel > Currency. Individual order rows still display in the currency the order was placed in. Requested by a user on wordpress.org
* Fix: **Variable products can now have descriptive (non-variation) attributes in the editor**. The "Product attributes" card, used for tag/spec attributes such as "Occasion" or "Material" that appear on the product page but do not create variations, was hidden whenever a product was variable, so those attributes could only be managed for simple products. The card now shows for variable products too, right alongside the Variations section: variation attributes (Size, Color) are still managed by the variations wizard, while descriptive attributes are added in the card. Both are saved together, and existing variations are untouched. Requested by a user on wordpress.org

= 3.1.24 (2026-06-14) =
* Improvement: **The modern Products screen loads faster on large catalogs**. The screen reads each product's categories, tags and other taxonomies as it builds the list, and it was doing so with a function that ignores the data WooCommerce had already loaded for the page, firing a fresh database query for every product and every taxonomy (roughly seven extra queries per row). It now reads from the data already in memory, cutting about 140 database queries off a single page of 20 products with no change to what you see. Works on both simple and variable products
* Fix: **No more off-brand focus box around the selected item in the classic menu**. When the modern navigation is turned off and the classic (re-skinned) WordPress menu is used, the selected or clicked menu item could show a harsh coloured outline (red on some systems) around its text, drawn by the browser or operating system. The classic menu now suppresses that native outline and, for keyboard users, draws the same clean on-brand rounded focus ring the modern menu uses, so clicking with the mouse stays clean while keyboard navigation still shows a clear, accessible highlight
* Improvement: **Welcome tour polish and Ad Platforms stays idle until connected**. The feature slides in the welcome tour were simplified from a two-column card grid to a clean single-column checklist, and the "Open your dashboard" button no longer turns blue on hover. The Ad Platforms daily sync job is now only scheduled while at least one platform (Google or Meta) is connected, and any leftover scheduled job is cleared when the module is off or disconnected, so nothing runs in the background until you actually connect an ad account. Google Sheets sync is unaffected and keeps running as before

= 3.1.23 (2026-06-13) =
* New: **Full SmartCrawl (WPMU DEV SEO) support in the product editor**. If you use SmartCrawl as your SEO plugin, the product editor's SEO card now reads and writes SmartCrawl's own fields (SEO title, meta description, focus keyword, canonical URL and "hide from search engines"), and shows a live SmartCrawl SEO analysis right inside the card: a score out of 100 plus a checklist of page and content checks that updates as you type, the same way SmartCrawl's own editor does. SmartCrawl's editor panel is built to only appear on the standard WordPress edit screen, so it could not be shown inside BrikPanel before; BrikPanel now runs SmartCrawl's own analyzer behind the scenes and presents the result in BrikPanel's design. Works on both simple and variable products. Requested by a user on wordpress.org
* Fix: **Products screen could fail to load with some SEO and column plugins active**. If a third-party plugin (for example SmartCrawl Pro) added a column or row action to the Products list and its code raised an error when run outside the standard WordPress products screen, that error could break the whole BrikPanel Products list so it showed a "page could not load" message instead of your products. BrikPanel now isolates every third-party column, cell and filter-bar contribution: if one misbehaves it is quietly skipped and the rest of the screen keeps working. Reported by a user on wordpress.org

= 3.1.22 (2026-06-13) =
* New: **Multi-currency stores now report in a single currency**. If your store takes orders in more than one currency, the dashboard used to add every order's raw total together regardless of its currency, so a 100 TRY order and a 100 USD order were summed as "200" and shown in your store currency. BrikPanel now converts every order to your store currency before adding it up, so Revenue, Average Order Value, the sales-over-time chart and the per-country sales on the globe are all reported in one comparable currency. When you use a multi-currency plugin such as CURCY (Currency Switcher for WooCommerce), the exact exchange rate from the day of each sale is read automatically from the order, so historical figures use the rate that actually applied at the time, not today's rate. For currencies that arrive without a saved rate, you can enter a flat fallback rate under WooCommerce > Settings > BrikPanel > Currency. Requested by a user on wordpress.org
* New: **Recent Orders shows each order in its real currency**. The dashboard's Recent Orders list used to print every total with your store currency symbol even when the order was placed in another currency. Each order now shows its own currency, with a small converted figure in your store currency underneath when the two differ
* New: **Editable "Sort order" column on the Products list**. The modern Products screen can now show a Sort order column (toggle it from the "Columns" menu, off by default). Type a number directly into the cell to set a product's position on the storefront when "Custom ordering" is active, the same value WooCommerce uses for menu order. Works on both simple and variable products
* Note: A product attribute that is NOT used for variations (for example an "Occasion" attribute used only as a descriptive tag) is already supported, in the product editor's "Product attributes" card, separately from the Variations section, on both simple and variable products

= 3.1.21 (2026-06-12) =
* New: **Two-way Google Sheets sync now covers price, cost and status**. Until now only Stock and Stock status could be edited in the sheet and written back to your store; the reverse sync now also writes back Regular price, Sale price, Cost (COGS) and Status. Edit those cells in your sheet, and the next sync applies them to the matching product. Every value is validated (prices and cost must be a number, status must be one of publish/draft/pending/private), an empty cell means "leave unchanged", and a built-in conflict guard keeps the store version if the same product was changed in WooCommerce after the last sync, so a sheet edit never silently overwrites a newer store change. Works on both simple products and variations, with each variation carrying its own price, cost and status. Requested by a user on serel.bg
* New: **It is now obvious which columns sync back**. Columns that write to your store are marked with a two-way glyph in the sheet header and a "two-way" badge in the settings column picker, and the Products tab shows a clear note listing exactly which columns are two-way and warning that every other column is display-only and will be overwritten on the next sync. The Status column also gets a helpful drop-down in the sheet
* New: **Short description and Description columns for the product sync**. You can now add the product short description and full description as columns in the Google Sheets product export. Both are off by default and can be switched on from the column picker; HTML is flattened to clean readable text, and a variation with no description of its own falls back to its parent's, so the column is never needlessly blank

= 3.1.20 (2026-06-12) =
* Fix: **JavaScript error when opening WooCommerce > Settings > BrikPanel**. The Custom CSS field's code editor was being started on every settings section even though that field only renders on the Appearance section, which threw an uncaught "Cannot read properties of undefined" error against a textarea that was not on the page. On some sites that error could interrupt other scripts and leave the settings screen looking visibly broken. The code editor now loads only on the Appearance section (also saving its assets everywhere else) and guards against a missing field. Reported by a user on serel.bg

= 3.1.19 (2026-06-11) =
* New: **Customer phone numbers in Segments and Customer Analytics**. The phone number now appears alongside the email everywhere you view or download a list of customers or orders: the Segments screen (both the Orders and Customers tabs) gains a Phone column, and the Customer Analytics screen shows the phone under the email in the Lifetime Value and RFM analysis customer lists. Every CSV export from those screens now includes a Phone column too, so you can use the data for SMS or WhatsApp marketing the same way you already use email. Phone is read from the order's billing details and falls back to the customer's saved billing phone, covering guests and registered customers alike, on both simple and variable products
* New: **Shipping class and Author columns on the product list**. The modern Products screen can now show a Shipping class column and an Author column, both toggled from the "Columns" menu and off by default, with your choice saved per user. The Author column is handy on multi-vendor setups such as Dokan, where it shows the product's seller. Works on both simple and variable products
* Improvement: **The master interface switch now lands you on the matching native screen**. Turning BrikPanel off from inside a panel screen no longer always drops you on the WordPress dashboard: it now takes you to the closest stock WordPress / WooCommerce equivalent of the screen you were on (the products list to the native product table, the product editor to that product's classic editor, coupons to the coupon list, customer analytics to WC Analytics customers, and so on). Screens with no native counterpart still fall back to the dashboard, and screens that are only skinned in place reload where they are. Developers can extend the mapping with the `brikpanel_master_off_landing_map` filter
* Improvement: **Top bar visual polish**. The 10px gap that appeared between the top bar and the "Screen Options / Help" row on WooCommerce list screens (orders, products, ...) was removed, the notification bell and "visit site" icon buttons were brought down to the same height as the Create button, and the user profile button was resized and given the same corner radius as the rest of the bar, so every control in the right-hand cluster now lines up in one consistent height and shape
* Fix: **Selecting a large global attribute no longer freezes the product editor**. Picking an existing global attribute that has thousands of terms (for example an `author` attribute with several thousand values) used to stamp every single term into the row as a selected tag, flooding the page with DOM nodes and locking the browser. The row now opens empty and you add only the terms you want through the existing type-ahead search, on both the Product attributes card and the variation wizard's Custom template. The full term list that was also being embedded into each option as JSON has been dropped (it was already sent in the save payload), trimming roughly 250kb off the editor page on stores with large taxonomies. Deliberate defaults (the Size + Color template's preset sizes, a product's already-saved values) are preserved. Works on both simple and variable products
* Fix: **Exported phone numbers are protected against spreadsheet formula injection**. A phone number that starts with "+" is written safely so spreadsheet apps treat it as text, not a formula

= 3.1.17 (2026-06-09) =
* New: **The orders overview is now a set of trend cards with a date-range filter**. The strip above the orders list has been reworked into separate cards for Total orders, Completed, Refunded and Revenue, each with its own mini sparkline showing the shape of the period, and a date picker (Today, Last 24 hours, Last 7 days, Last 30 days) that updates every card and the marketplace panel at once. Hourly detail is used for the day views and daily detail for the week and month views, all in your store's time zone. Your chosen range is remembered between visits, and the role-based "Hide orders analytics" control still applies. Counts use the same valid-sale and refund statuses as the rest of BrikPanel, on both simple and variable products
* New: **Export your custom checkout fields to Google Sheets**. Any extra checkout or order fields on your store (added through WooCommerce's own checkout fields, a checkout-field plugin, or a code snippet) are now detected automatically and offered in the Orders "Columns to export" picker, alongside the built-in columns. Pick the ones you want and their values are written to your sheet on every sync. Works for both simple and variable products
* New: **Filter the Google Sheets order export by shipping method**. A "Shipping methods to export" picker on the Orders tab lets you push only the orders that used the methods you choose (for example only Local pickup, or only Flat rate). Leave every box unchecked to export every order as before
* New: **Cost of Goods (COGS) in the Google Sheets export**. Three new optional columns are available: "Order COGS total" (the whole order's cost of goods) and "Line COGS (cost × qty)" on the Orders tab, and "Cost (COGS)" on the Products tab. Costs use the same per-unit values as BrikPanel's Profit reports, with variations falling back to their parent's cost when they have none of their own. They are off by default; add them from the relevant "Columns to export" picker
* Fix: **Two-way product sync no longer re-pushes rows that did not change** when the rightmost exported column is blank for some products (for example a "Cost (COGS)" column with no cost set). Google Sheets drops trailing empty cells when read back, which made those rows look different from what was pushed and triggered a needless re-push on every poll. Rows are now compared at their full width, so only genuine edits flow back. Two-way status sync for orders and stock sync for products are both verified working, including when the new optional columns shift the position of the Order status or Stock column

= 3.1.15 (2026-06-09) =
* Fix: **Costs entered in WooCommerce's own Cost of Goods Sold field now show up in BrikPanel**. If you set a product's cost from WooCommerce's native Cost of Goods Sold field (rather than BrikPanel's editor), that cost was previously invisible to BrikPanel: the dashboard Profit/COGS read as empty and the Cost column and Quick Edit on the product list showed nothing, even though the value was clearly saved on the product. BrikPanel now reads WooCommerce's native cost everywhere and keeps it in step automatically, so the figure appears at once. Existing products are caught up in a one-time pass on update; works for both simple products and variations

= 3.1.15 (2026-06-08) =
* New: **SEO fields for SureRank right inside the product editor**. SureRank's SEO title, meta description, canonical URL and focus keyword now appear inline in the BrikPanel product editor, with a live SEO-analysis panel that scores the current, unsaved values as you type. SureRank's own editor is a React popup that cannot draw inside a custom screen, so the fields are surfaced through BrikPanel's unified SEO card instead. Everything is written back into SureRank's own `surerank_settings_general` meta (plus the per-post noindex flag), so the storefront output and SureRank's own dashboard stay perfectly in sync. Works on both simple and variable products
* New: **Limit the Google Sheets product sync to selected categories**. A category picker on the Products tab lets you push only the products in the categories you choose (sub-categories included) instead of the whole catalogue. Off by default (all products). "Sync now" fully clears and rebuilds the Products tab, so narrowing the filter never leaves stale rows behind for products that no longer match. Covers simple products and their variations
* New: **Hide the orders analytics summary from chosen roles**. A new "Hide orders analytics from roles" setting under WooCommerce -> Settings -> BrikPanel -> Access control hides the 30-day revenue and order-count strip above the orders list from any roles you pick, while those users keep the full orders screen. Ideal for multi-branch stores where branch staff process orders without seeing the whole store's totals. What you select is exactly what is hidden, and a defence-in-depth check on the data endpoint stops a hidden role from fetching those figures directly. Note: this hides the store-wide numbers, it does not recalculate them per branch
* New: **Choose which order statuses feed your dashboard order stats** (WooCommerce -> Settings -> BrikPanel -> Analytics). You can now decide exactly which order statuses count as valid sales and which count as refunds, so stores using shipment-tracking or returns plugins with custom statuses ("Partially shipped", "Delivered", "Partially refunded", ...) stop having those orders quietly left out of the figures. The choice drives every dashboard number alike: Revenue, Orders, Average Order Value, Profit and Customer Lifetime Value
* Improvement: **Compatibility with PixelYourSite Product Catalog Pro** — its product-data fields now render and save correctly inside the BrikPanel product editor, on both simple and variable products
* Fix: **A store with no products no longer triggers an uncaught error**. On an empty catalogue the dashboard store-summary inventory query (an INNER JOIN onto stock data) returned no row, and the code then read totals straight off that missing row. It is now guarded, so a brand-new store with no products reports zero units and zero value instead of crashing the page
* Fix: **Resolved a conflict with the Admin and Site Enhancements (ASE) plugin** so ASE's tweaks and BrikPanel's interface no longer clash on the same admin screens
* Fix: **Navigation scrolling glitch** — fixed unwanted scrolling reported while moving around the dashboard

= 3.1.13 (2026-06-06) =
* New: **Exclude staff or point-of-sale accounts from customer analytics**. If you also ring up in-person sales through one or two staff or POS logins, those accounts can rack up hundreds of orders and quietly distort every per-customer number: they inflate the average lifetime value, dominate the RFM segments, and skew cohort retention, so the figures stop describing your real customers. A new "Exclude customers" button on the Customer Analytics page opens a simple picker where you can search and choose specific accounts and/or whole roles to leave out. Excluded accounts still count fully toward your shop totals (revenue, order counts, the dashboard sales figures and the Segments "Orders" tab are all unchanged), they are only removed from the customer-level views: lifetime value, RFM segments, cohort retention, the Customer Analytics tables and the Segments "Customers" tab. Saving recomputes the metrics immediately so the page reflects the change at once, and a small badge on the button shows how many accounts are currently excluded. Works the same on stores with simple and variable products
* Fix: **Stale customer rows are now pruned reliably after a recompute**. The nightly customer-metrics rebuild marks the run with a timestamp and then deletes any customer row it did not touch (for example someone whose orders were all refunded out, or who is now excluded). On servers whose database session time zone is not UTC, that marker was taken from PHP in UTC while the rows were stamped in the database's local time, so the cleanup compared two different clocks and left stale rows behind for up to the time-zone offset. The run marker is now read from the database itself, so the comparison always uses one clock and stale rows are removed on the first recompute

= 3.1.12 (2026-06-01) =
* Fix: **Variable products no longer stay "out of stock" once their variations are back in stock**. If a variable product had ever been switched to manage stock at the *parent* level with a quantity of 0 (so the parent was pinned to "out of stock"), turning the variations back on and raising their stock left the whole product reading out of stock, because WooCommerce trusts a parent that manages its own stock and never looks at the children. BrikPanel never manages stock at the parent level for variable products (each variation owns its own stock), so the editor now clears that leftover parent-level stock flag on every save and lets the stock status be derived from the variations: when any variation is in stock, the product is in stock. A one-time, self-healing migration runs in the background on upgrade and repairs already-saved products in the same situation (parent managing stock, marked out of stock, but with at least one in-stock variation), in safe batches so large catalogs are never slowed; products that are genuinely out of stock are left untouched. Applies to both simple and variable products

= 3.1.7 (2026-06-01) =
* New: **Desktop Mode compatibility**. BrikPanel now plays cleanly inside the "Desktop Mode" plugin, which turns /wp-admin into a desktop-style workspace where each screen opens in its own draggable window. Whenever a page renders under the Desktop Mode shell (either inside a window or on the shell host), BrikPanel stands down its own global chrome, the top bar and the custom navigation sidebar, so it does not duplicate the window title bar, paint a redundant strip over the desktop, or leave an orphaned content margin where the sidebar used to be. Desktop Mode's dock takes over navigation and its Cmd/Ctrl + K palette covers search, while every BrikPanel screen (dashboard, orders, the product editor, ...) fills its window edge to edge with all of its styling intact, on both simple and variable products. The integration is fully scoped: a page detached to a classic tab keeps the complete BrikPanel chrome, and when Desktop Mode is not installed nothing changes at all
* Fix: **Custom fields added through the `brikpanel_product_editor_boxes` hook are saved again**. Inputs a developer renders inside their own editor card (including ACF fields via `acf_render_fields()`) were drawn on the page but never reached the save request, so they silently dropped on every save. The product editor's save collector now also gathers every named input inside `.brikpanel-pe-ext-card` (alongside the metabox, WooCommerce-field and per-variation collectors) and forwards it to the server, where the save handler fires `save_post` / `save_post_product` so the owning plugin's own listener persists the value. ACF's hidden `#acf-form-data` nonce block is emitted once per page and travels with the payload so ACF can verify its nonce and run `acf_save_post()`. Works on both simple and variable products
* Improvement: **Silent auto-save no longer runs on a product that has not been published yet**. The editor's 60-second background auto-save used to fire on any dirty form, which could quietly write a brand-new or draft product to the database before the user was ready. It is now gated on a live flag (`#bpe-product-id[data-live]`, set server-side only for `publish` / `private` products) so a work-in-progress draft or an auto-draft is never persisted behind the user's back, auto-save only protects an already-live product from losing edits. The flag flips on the moment you publish from the editor and reverts if you move the product back to draft, on both simple and variable products

= 3.1.6 (2026-05-30) =
* New: **Master on/off switch for the whole BrikPanel interface**. A single store-wide toggle (WooCommerce -> Settings -> BrikPanel -> Access control, "BrikPanel interface", on by default) flips every back-office user between BrikPanel and the stock WordPress / WooCommerce admin in one click. You can also flip it from the on/off switch in the BrikPanel top bar, or from the native WordPress admin bar while BrikPanel is off, so you can always get back in. Only administrators see and control it, the control is nonce-checked and `manage_options`-gated, and its styling is inlined so it survives even when all BrikPanel assets are swept off. This is the global, all-users axis that sits above the existing per-user / per-role Access control
* New: **Reworked mobile and tablet layouts across the interface**. The dashboard, product list, product editor, orders and top bar were all given proper responsive breakpoints (960 / 782 / 600 / 480 / 380px). KPI and profit cards reflow from four to three to two columns as the screen narrows, the product editor's sticky header folds into two rows with the status menu re-anchored as a near-full-width sheet that stays on screen, the product list table and filter bar compress for phones, and the top bar collapses to icon-only on the smallest screens. Pure CSS, no markup or query changes, and it covers both simple and variable product screens
* New: **Bulk editor now covers categories, brands, weight, dimensions and tags**. The product list bulk update gained shipping fields (Set weight / length / width / height, shown in your store's configured weight and dimension units) and per-taxonomy actions that are generated for every product taxonomy on the store: Set / Add to Categories, Tags, Brands (any registered brand taxonomy is auto-detected) and any custom product taxonomy. "Set" replaces the terms, "Add to" appends them, with a searchable hierarchical term picker. Each taxonomy is capability-gated, runs in safe batches via the existing job runner (prepare / process / cancel AJAX), and works on both simple and variable products

= 3.1.5 (2026-05-29) =
* New: **Google Ads is now live for everyone**. Google approved the `adwords` sensitive-scope verification for our OAuth project, so the "Coming soon" skin on the Google Ads card is off by default and the full flow works out of the box: **Connect Google Ads**, account picker, Manager (MCC) account support, **Sync now**, and Disconnect. Daily spend, impressions and clicks flow into the dashboard for real ROAS and Net Profit, exactly like Meta. The skin is kept only as an operator escape hatch (a single `wp-config.php` constant or option) in case Google ever revokes the verification, so it can be re-hidden without a code change. Meta Ads stays in its own pending-review state, unchanged
* New: **"Imported spend data" panel on the Ad Platforms page**. A month-by-month breakdown plus an all-time summary for each connected platform, so you can see exactly what BrikPanel has pulled behind the dashboard figures: total spend, impressions, clicks, average CTR / CPC / CPM, the number of days with data, and the full date span. Rows are grouped by currency so a rare mid-life account-currency switch stays visible instead of being silently summed, and a Refresh button re-reads the latest. Backed by two new read-only store queries (`account_summary()` / `monthly_breakdown()`) and a nonce-checked, `manage_woocommerce`-gated `brikpanel_ads_spend_breakdown` AJAX endpoint
* New: **Restrict BrikPanel settings to administrators**. A new "Restrict settings to administrators" toggle under WooCommerce -> Settings -> BrikPanel -> Access control keeps the settings tab administrator-only and is **on by default**. Shop managers and other roles that can manage WooCommerce keep the full BrikPanel interface but are kept out of the settings tab itself, even by direct link: the tab is removed from the WooCommerce settings nav, a direct hit on `?tab=brikpanel` lands silently on WC General (no PHP notice), and defense-in-depth 403 guards sit on the render and save paths. This is a separate, narrower axis from the existing interface Access control, so a shop manager can keep BrikPanel while only administrators touch its configuration. Turn it off to hand the settings page back to every `manage_woocommerce` user. Super admins on multisite always pass
* Fix: **Loading accounts for a Google Ads manager (MCC) user no longer floods the "Recent errors" log**. Manager-only sub-accounts routinely return a 403 on the customer-info enrichment call (the account is visible in the list but only reachable through the manager), which is an expected outcome, not a failure. That specific 403 is now silenced from the error log while genuinely unexpected errors (for example a 500) are still recorded
* Tweak: The Ad Platforms dashboard ROAS labels are now fully translatable, and a number of user-facing strings across the Ad Platforms screens were reworded for clarity

= 3.1.1 (2026-05-24) =
* New: **Google Sheets two-way sync — Sheets edits now flow back into WooCommerce**. The Sheets integration is no longer push-only. Two new flows ship alongside the existing one-way pushes: (1) **Orders pull** — the Orders tab is polled every 2 / 5 / 15 minutes (your pick), and any change to the **Order status** column is applied to the matching `WC_Order` via `update_status()` with a "Status changed via Google Sheets sync." order note; status text is normalised so "Processing", "wc-processing" and the localised label all map back to the right WC key. (2) **Products pull** — a new dedicated **Products** tab pushes every simple product and every variation (variations get their own row, parent_id column points to the parent) with id / SKU / name / price / **stock** / status; the Stock column is the only writable cell and changes flow back into WooCommerce on the next poll. Last-write-wins conflict resolution compares each cell against a sha256 snapshot stored on product/order meta AND against `_date_modified`, so a stale poll cannot clobber a fresh Woo edit (a 10s grace window absorbs same-second push/save races); divergence detected mid-poll is logged and the row is re-pushed instead. Push side is event-driven (`woocommerce_product_set_stock`, `woocommerce_variation_set_stock_status`, `woocommerce_new_product`, etc.) with a 5-second debounce so bulk inventory updates coalesce into one Sheets API call; a "Pull now" button next to "Sync now" runs the reverse direction synchronously and a structured toast reports `checked / applied / conflicts`. Tabs are dropdown-validated with the real WC status set on first push so merchants pick from a list instead of free-typing a status that would be silently skipped. Off by default per flow (the toggles say "Two-way sync: apply status / stock edits from Sheets") — the existing one-way push behaviour is unchanged for stores that don't opt in. Works identically on simple and variable stores
* New: **ACF (Advanced Custom Fields) field groups now auto-render in the BrikPanel product editor** — reported by a user who created ACF fields targeting `product` and never saw them appear. Root cause: BrikPanel relied on the merchant to hand-pick every metabox via the "Third-party plugin metaboxes" multiselect, but the multiselect was built from `add_meta_boxes` snapshots that fire only on `load-post.php` / `load-post-new.php`, neither of which runs on the BrikPanel editor page, so ACF's per-group metaboxes were never even registered to be picked. The editor now bootstraps ACF metaboxes directly (`ACF_Form_Post::add_meta_boxes()`) when rendering, AND auto-resolves every ACF field group whose Location Rules match the current product via `acf_get_field_groups( [ 'post_type' => 'product', 'post_id' => $id ] )` so the matching groups appear without the merchant touching the multiselect. A new **"Auto-include ACF field groups"** toggle (default on) lives directly above the metaboxes multiselect under WooCommerce → Settings → BrikPanel → Products; a `brikpanel_pe_auto_include_acf` filter lets developers gate it programmatically per product. Save round-trips already work because the editor emits ACF's hidden `_acf_nonce` / `_acf_post_id` / `_acf_screen` / `_acf_changed` block. Applies to both simple and variable products
* New: **Eight popular-language translations bundled in the plugin** — fully translated UI for German (`de_DE`), Spanish (`es_ES`), French (`fr_FR`), Italian (`it_IT`), Dutch (`nl_NL`), Polish (`pl_PL`), Brazilian Portuguese (`pt_BR`) and Russian (`ru_RU`), shipped alongside the existing Turkish (`tr_TR`) and refreshed to cover every string introduced in this release (Two-way sync UI, ACF auto-include toggle, Pull now / Poll interval controls, conflict toasts, etc.). PO + MO + WP 6.5+ `.l10n.php` files are all included so stores using any of these locales get a localised admin out of the box, no manual `wp i18n` step required

= 3.0.9 (2026-05-22) =
* Fix: **Foreign-plugin icons rendered as empty squares when a non-default Interface font was selected** — the Appearance feature applied the chosen typeface with `[class*="brikpanel-"] *`, and the topbar feature tags both `<body>` and `<html>` with `brikpanel-has-topbar` so its layout offsets can apply. Together those two facts made the broad selector match every descendant of `<body>` on every admin page that rendered the topbar, including third-party plugin screens. Icon-font glyphs (Font Awesome, Material Icons, etc.) lost their `font-family` to the Interface font and rendered as tofu boxes. The selector now excludes `body` and `html` so real BrikPanel wrappers like `.brikpanel-dashboard` and `.brikpanel-topbar-*` still receive the font while foreign plugin UIs are no longer touched. Reported on a WP Mobile Bottom Menu (WP BNav) icon picker; the same root cause affected any third-party admin screen using icon fonts. No change at the default "System default" font setting

= 3.0.9 (2026-05-19) =
* New: **Site-wide Cmd/Ctrl + K command palette**. The palette no longer scans only orders; it now searches four sources in one place: **Orders** (customer name, email, phone, order ID, or a product SKU inside the order), **Products** (simple and variable, by name or SKU, variations included), **Customers** (registered users by name, email, or username), and **Navigation** (jump to any admin page, including screens added by third-party plugins). Every source has its own on/off toggle under a new WooCommerce → Settings → BrikPanel → "Search" section, so the palette can stay orders-only or open up to a full admin-wide search, and a `brikpanel_search_sources` filter lets developers add, remove, or reorder sources. The admin menu is indexed per user on real page loads (admin-ajax never builds the menu, so it is read back from a per-user transient during the search request), every source is independently capability-checked, and the placeholder stays "Search orders" while orders is the only active source so existing users see no change. Resolves the report that Cmd/Ctrl + K only found orders and could not reach the rest of the site or third-party plugin pages

= 3.0.5 (2026-05-19) =
* New: **GTIN column on the products list** — the BrikPanel product list can now show a **GTIN** column reading WooCommerce's native `_global_unique_id` field (`WC_Product::get_global_unique_id()`). Off by default; flip it on per-user from the **Columns** popover (persisted in user meta, like every other column). Variable products show the parent GTIN, or the aggregated variation GTINs when the parent has none — so it works for both simple and variable products
* New: **Search products by SKU** — the product list live-search box now matches on SKU as well as title. A `posts_search` filter rewrites the query so a search term hits a product's own `_sku` **and** surfaces a parent product whenever one of its variation SKUs matches, with `$wpdb->esc_like()` escaping throughout. Resolves the user report that SKU search did not work on the product list
* New: **Yoast SEO for WooCommerce compatibility** — the WooCommerce-specific Yoast addon (detected via `WPSEO_WOO_VERSION`) ran its identifier/GTIN analysis against `#product-type` and `#_sku` DOM nodes that the simplified BrikPanel editor never rendered, so it errored out. The editor now emits hidden shim nodes mirroring the real product type and SKU and keeps the hidden `#product-type` in sync when the BrikPanel type selector changes, so the Yoast Woo SEO analysis and score panel run correctly inside the BrikPanel product editor for both simple and variable products
* New: **Dashboard export button** — a new export button next to the dashboard date-range presets downloads the full dashboard as a multi-sheet Excel workbook (Summary, conversion funnel, order status, devices, customer segments, top products, most-viewed, most added-to-cart, sales-over-time, countries, cities, low stock, subscriptions and full order records) for the active date range. Built from the exact payload the dashboard renders so the file can never drift from the screen; streamed via `admin-post.php` (`brikpanel_dashboard_export`, nonce-checked, `manage_woocommerce`-gated) with real numeric cells so the spreadsheet can sum and sort
* New: **Shipping class in the product editor** — WooCommerce's `product_shipping_class` taxonomy is now selectable in the simplified product editor as an opt-in **Shipping class** section (enable it from WooCommerce → Settings → BrikPanel via the editor section list; hidden by default). Simple products get one selector; variable products additionally get a per-variation shipping class column with a "Same as parent" inherit option, so every variation can override individually. Closes the migration gap reported by users who relied on WooCommerce shipping classes
* Fix: **Bullet points now render in the product editor and on the storefront** — bulleted and numbered lists created in the editor were being wrapped in an invalid `<p> > <ul>` structure so they did not display as a list. After an insert-list command the editor now unwraps the list from its surrounding paragraph, and explicit `list-style` / `display:list-item` CSS for nested `ul`/`ol`/`li` (disc → circle → square) makes lists render correctly in both the editor and the front-end product description
* Improvement: **Richer product description editor** — the description and short-description editors gained a block-format dropdown (Paragraph, Heading 2, Heading 3, Heading 4) that reflects and applies the current selection's block, plus heading CSS so the formatting is visible while editing. Combined with the existing visual ⇄ HTML source toggle, content pasted from a website (which keeps its markup) can now be retagged with proper headings from the toolbar instead of only being fixable in the code editor
* Fix: **Google Sheets "Choose existing spreadsheet" 403 right after connecting**: Google's consent screen presents the Drive permission as an optional checkbox, so a user could complete OAuth with a perfectly valid token while the `drive.file` scope was never actually granted. The connection then showed a green "Connected", but the Picker, "Create new spreadsheet" and every sync failed with a raw Google 403 until the user disconnected and reconnected. BrikPanel now verifies the granted scope after consent and refuses a connection that is missing Drive access with a clear, actionable message; surfaces a prominent warning on an already broken connection; and blocks the Picker and create-sheet actions with a fix-it prompt instead of leaking a scope-less token to a raw Google 403. Behaves identically on simple and variable stores

= 3.0.4 (2026-05-18) =
* New: **Access control** — a new WooCommerce → Settings → BrikPanel → "Access control" section lets you keep the BrikPanel interface for some users while leaving others on the stock WordPress / WooCommerce admin. Disable for **administrators** with one toggle (the common agency setup: clients who are shop managers get BrikPanel, the agency's own administrator account stays vanilla), and/or for any **roles** or hand-picked **individual users**. Disabled users get the native admin menu, dashboard, product/order/coupon screens and zero BrikPanel styling; everyone else is unaffected. Enforced in two layers — every interface toggle is short-circuited to "off" so each module renders the native screen, and all always-on BrikPanel assets, the extra order-list columns and the font/accent/brand-logo theming are swept — so the result is pixel-for-pixel the default experience. BrikPanel analytics, tracking and background jobs keep running for the store regardless. The BrikPanel settings tab is always reachable (with the real toggle states) even for an excluded administrator, so you can never lock yourself out

= 3.0.2 (2026-05-16) =
* Security: **Signed proxy responses** — every reply from the brksoft.com proxy (Google Ads, Meta Ads and Google Sheets OAuth) is now HMAC-SHA256 signed with a freshness timestamp. The plugin verifies the signature on every successful response and refuses to act on any unsigned, tampered, replayed or stale body instead of trusting it — closing cache-poisoning / transport-tampering / log-only attack paths
* Security: **Remote kill-switch** — a signed `revoke` directive lets the proxy operator make all installs immediately wipe their stored Google / Meta / Sheets tokens and stop calling the proxy until the user reconnects, so a suspected proxy compromise can be contained without a plugin update
* Security: **Google Ads query allow-list** on the proxy — only the exact daily-spend query is accepted; any attempt to pull search terms, PII or other resources through a connected account is rejected
* Security: **Hostile `raw_data` handling** — ad-spend API payloads are depth-, size- and charset-capped before they are stored, so a malicious response cannot bloat the table or smuggle content to later consumers
* Security: Proxy global off-switch, `no-store` / `noindex` response headers, and operational hardening notes for the brksoft.com proxy
* Tweak: Version bump to 3.0.2; no functional changes to the dashboard, sync or UI

= 3.0.0 (2026-05-15) =
* New: **Google Ads & Meta Ads integration** — BrikPanel now pulls daily ad spend from Google Ads and Meta (Facebook / Instagram) Ads into a local table so the dashboard can show **real ROAS and Net Profit** next to store revenue. Three new KPI cards render under the existing dashboard metrics: **Ad Spend** (summed across every connected platform for the active date range), **ROAS** (store revenue ÷ ad spend), and **Net Profit** (revenue − COGS − ad spend − manual expenses). The cards are multi-currency aware — when an ad account reports in a different currency than the store, spend is shown split as "₺X + $Y" and ROAS / Net Profit are intentionally omitted (UI shows "—") instead of printing a misleading converted number. COGS is read from WooCommerce's native order COGS meta through a dedicated HPOS-compatible query; manual expenses come from the existing BrikPanel expenses table. The cards only appear once the first sync has written real data
* New: One-click OAuth connect per platform through the same brksoft.com proxy pattern as Google Sheets — PKCE-protected handoff, and the Google **developer token** / Meta **app secret** / OAuth client secret never ship inside the plugin (the proxy injects them server-side). Tokens are kept in a single encrypted multi-platform vault (`sodium_crypto_secretbox`, AES-256-GCM fallback, key HKDF-derived from the site's WP salts) with platform-aware refresh: Google uses the standard `refresh_token` grant, Meta uses the `fb_exchange_token` long-lived-token swap. A revoked / `invalid_grant` connection auto-clears so the UI shows a clean "reconnect" state instead of looping on errors
* New: Per-platform **primary account picker** — Google enumerates accounts via `listAccessibleCustomers` with manager-account (MCC) `login-customer-id` support; Meta lists `/me/adaccounts` including accounts under a Business Manager. On first account selection BrikPanel backfills **3 years of history**, split into 90-day Action Scheduler chunks scheduled most-recent-first so today's spend appears on the dashboard within minutes while the full history fills in behind it. A daily sync re-pulls the trailing 7 days to absorb the late revisions ad platforms apply to recent-day numbers; every write is an idempotent UPSERT so re-syncing or overlapping windows never duplicate a day
* New: Dedicated **Ad Platforms** page under the WooCommerce menu (Beta badge), a "Connect ad accounts" call-to-action on the dashboard, a per-platform manual **Sync now** button, backfill progress, and a token-redacted error log viewer. A master toggle under WooCommerce → Settings → BrikPanel → **Ad Platforms** (default on) makes the whole module dormant when off — no admin page, no scheduled sync, no dashboard cards — while saved connections are kept. Google Ads stays locked behind a switch until its Google-approved developer token is live so users never hit a dead "Connect" button; Meta is unaffected. A new `wp_brikpanel_ad_spend` table is created on activation alongside the other BrikPanel tables, and the raw API payload is retained per row for the planned BrikMentor analysis
* Developer: New proxy-tunnelled **Google Ads API** and **Meta Marketing API** clients (`Brikpanel_Ads_Google_Client`, `Brikpanel_Ads_Meta_Client`) built on `wp_remote_*` with one-shot 401 refresh-and-retry, infrastructure-only backoff (HTTP 429 / 502 / 503 / 504 plus Meta rate-limit codes 4 / 17 / 32 / 613) and no retry on application-level 500s so a misconfigured proxy fails fast instead of hanging the settings UI — no Composer dependency added, reusing the foundation laid by the 2.9.0 Sheets client

= 2.9.5 (2026-05-13) =
* New: Multisite network access rules — when BrikPanel is network-activated, every subsite admin used to inherit full visibility of the WooCommerce → BrikPanel settings tab; a new "BrikPanel Access" page under Network Admin → Settings now lets the Super Admin enforce a role allowlist (`brikpanel_network_access` site-option). When enforcement is on, only users whose role is in the allowlist see the settings tab, the BrikPanel sidebar menus, and can hit any `brikpanel_*` AJAX endpoint — gated centrally through `brikpanel_user_can_access()` so a single check applies across surfaces and the `administrator` role can never be removed from the allowlist (defense-in-depth)
* New: **Delete individual variations** from inside the BrikPanel product editor — every row in the variation table now has a per-row trash button with an in-place confirmation, and the deletion is finalized when the parent product is saved. Combined with the existing **Generate variations** button this closes the last gap users hit when migrating away from the default WooCommerce variations tab. Works on both brand-new variable products and existing ones with attribute combinations already generated
* New: Unsaved-changes guard on the product editor — clicking the top-left "Back to Products" arrow (or closing the tab / reloading) while any field is dirty now triggers the browser's native `beforeunload` confirmation instead of silently discarding edits. Dirty state is tracked on every input / textarea / select / contenteditable inside the editor body
* New: Quick-edit drawer **featured product star** — the slide-in quick edit panel from the products list now exposes the same featured-product star that lives in the row and the full product editor, so a product can be flipped in/out of WooCommerce's featured pool without opening either screen. Backed by the same `brikpanel_toggle_featured` AJAX endpoint as the row icon; row + drawer star sync via a shared `applyQeFeaturedState()` so toggling either surface updates the other instantly. Works for both simple and variable products
* New: Optional advanced coupon restriction fields — the slide-over coupon editor stays minimal by default, but six WC-native restriction fields can now be enabled individually under WooCommerce → Settings → BrikPanel → Coupons: **Products**, **Exclude products**, **Product categories**, **Exclude categories**, **Allowed billing emails** and **Limit usage to X items**. Each toggle is checked both on the editor render side AND inside the AJAX save handler so a hostile payload cannot write to a field that an admin has not enabled. Closes the migration gap reported by users moving from heavy WC coupon workflows
* New: Drag-free **dashboard section ordering** — the existing "Visible dashboard sections" multiselect is now an ordered list with per-row visibility checkbox and up/down arrow buttons (same pattern as the product editor section ordering), so dashboard cards can be both hidden and reordered without touching the drag-and-drop API. Order persists as `brikpanel_dashboard_section_order` JSON, and the dashboard renderer resolves the final order through a `brikpanel_dashboard_section_order` filter so developers can override programmatically
* New: "Copy everything" help tooltip — the previously-cryptic dashboard "Copy everything" button now ships with a question-mark icon next to it whose hover/focus tooltip explains exactly what it does: bundles every dashboard metric (KPIs, top products, recent orders, customers, settings) into a single Markdown report and copies it to the clipboard, ready to paste into ChatGPT / Claude for instant store analysis. CSS-only popover, repositions right-aligned on screens under 900px
* New: **Google Sheets** integration ships with a "Beta" badge on its menu item and page header, and can now be fully disabled from WooCommerce → Settings → BrikPanel → "Google Sheets integration" with a single checkbox (`brikpanel_gs_module_enabled`, default on). When disabled, no admin page, no sync classes, no OAuth handlers and no `woocommerce_new_order` listener are registered — zero overhead on stores that do not use the connector
* Fix: Third-party **brand / taxonomy columns** in the products list now render as comma-separated, locale-aware brand labels instead of dumping the raw array (`Array` or `["Brand1","Brand2"]`). The ASE bridge routes any column whose source is a taxonomy through `get_the_terms()` + `sanitize_term_field()` + `wp_get_list_item_separator()` before output, with per-term escaping — fixes brand columns added by WooCommerce Brands, Perfect WooCommerce Brands, YITH Brands and any plugin that registers a taxonomy column on the products list
* Fix: Variable products created through the BrikPanel editor sometimes lost their variation selector on the storefront (notably reported on stores running the Blocksy Pro theme). Root cause: an in-flight `save_post` hook reloaded the parent product through WC's poisoned factory cache and silently flipped the `product_type` term back to "simple". `save_variations()` now reasserts the `variable` term with `wp_set_object_terms()`, clears WC's per-product `_type_` cache via `WC_Cache_Helper::get_cache_prefix()`, calls `clean_post_cache()`, and finally calls `WC_Product_Variable::sync()` on a freshly-instantiated parent so the frontend always recognizes the product as variable

= 2.9.1 (2026-05-12) =
* Critical fix: Google Sheets sync handlers were registered only inside the `is_admin()` gate, so Action Scheduler workers (WP-Cron / CLI) and the front-end `woocommerce_new_order` hook never saw them — real-time sync silently dropped new orders and bulk export failed with "no callbacks registered". Bootstrap now loads outside the admin gate (same pattern as BrikControl); admin menu / AJAX endpoints still self-gate to admin context
* Critical fix: "Sync now" was queueing an Action Scheduler job and returning immediately, leaving the user with no progress, no row count, and no completion signal. Now runs inline with a spinner, sticky "Syncing…" toast, and a final success toast reporting actual rows + duration. Bulk export still paginates in the background via Action Scheduler when more rows remain
* New: "Reset & re-push everything" button on the Orders tab — clears the `_brikpanel_gs_synced_at` flag from every order so the next Sync re-pushes the full history to the currently configured tab. Useful when renaming the target tab so the old history appears in the new tab
* New: switching the target spreadsheet now automatically resets sync state — every order is re-pushed to the new sheet on the next sync (was: silently kept the old "synced" flags so new sheet stayed empty)
* Improvement: Sync now feedback is data-driven — when nothing new was synced, the toast explains "every order is already marked synced" and points to the Reset button instead of returning silent zero
* Improvement: Reports / Customers / Orders sync handlers return structured stats (`rows`, `orders`, `more`) so manual sync can report exact numbers and the JS UI can refresh the "Last successful sync" stamp inline without a page reload
* Improvement: `ensure_tab` now detects pre-seeded empty tabs (created via the "Create new spreadsheet" flow) and writes their header on first sync instead of leaving them headerless. Existing tabs with non-empty headers are never overwritten
* Improvement: Reports analytics helpers (`brikpanel_get_total_revenue`, `brikpanel_get_visitor_count`, etc.) are now explicitly loaded by the reports-sync handler, so Sales Summary / Daily KPIs / Top Products / Funnel tabs work when running inside Action Scheduler workers (previously silently emitted zero rows)
* Improvement: Token refresh stays robust when `expires_at` has already lapsed — the lazy refresh path runs synchronously through the brksoft.com proxy and surfaces auth errors clearly

= 2.9.0 (2026-05-12) =
* New: **Google Sheets integration** — a fully native, one-click connector that streams BrikPanel data into a Google Sheet of your choice. Four flows ship in V1: (1) **Real-time order sync** — every new WooCommerce order is appended to a dedicated tab within seconds, with one row per line item so variations get their own row and attribute columns; status changes update the existing row in place via stored row indices kept in order meta. (2) **Scheduled bulk export** — Action Scheduler-backed hourly/4h/daily job that catches up historical orders matching a configurable date range and status set; same idempotency guarantee, so manually re-running "Sync now" never duplicates rows. (3) **Analytics report snapshots** — four overwrite-mode tabs (Sales Summary, Daily KPIs, Top Products, Funnel) are refreshed on an interval, exposing total-sales, conversion, AOV, refund/conversion rates and the visitor → checkout funnel directly in Sheets for formulas and pivots. (4) **Customer + RFM snapshot** — chained to the nightly RFM recompute so the segments tab refreshes the moment the metrics table does. Authentication uses an OAuth proxy that BrikPanel hosts on brksoft.com (PKCE-protected handoff token, never sends the auth code through the browser URL); the plugin stores only encrypted access/refresh tokens locally (sodium_crypto_secretbox keyed off AUTH_KEY + SECURE_AUTH_KEY) and requests minimum scopes — `spreadsheets` + `drive.file` (NOT full Drive). HPOS-compatible queries throughout, custom error log with bearer/token redaction, exponential backoff on 429/5xx, and full re-pin into the modern sidebar. Top-level menu page (Google Sheets) under WooCommerce → BrikPanel
* Developer: New WP-CLI-compatible Sheets API client (`Brikpanel_Sheets_Client`) using `wp_remote_*` with built-in 401-refresh, 429 exponential backoff, and 403 rateLimitExceeded handling — no Composer dependency added. Reusable foundation for the planned Google Ads integration in 3.0

= 2.8.6 (2026-05-11) =
* New: Featured product star — a new opt-in setting adds a clickable star next to the status dropdown in the simplified product editor and at the start of every row in the products list, so any product can be flipped in or out of WooCommerce's featured pool without opening the full editor. Backed by WC's native `featured` term on the `product_visibility` taxonomy (single source of truth shared with storefront shortcodes and "featured" widgets), with optimistic UI and a dedicated `brikpanel_toggle_featured` AJAX endpoint. Off by default so existing installs are unchanged
* New: Brand logo for the BrikPanel topbar and the modern login page — a new opt-in toggle under WooCommerce → Settings → BrikPanel → Appearance lets store owners pick a single brand image from the media library that replaces both the BrikPanel mark in the admin top bar AND the centered logo on the modern login screen. One picker drives both surfaces so the brand stays consistent. Off by default; wide non-square logos stretch horizontally up to 160px in the top bar instead of being letterboxed
* New: Settings import / export — a new "Import / Export" section under WooCommerce → Settings → BrikPanel downloads every BrikPanel option as a single portable JSON file (toggles, layout, accent color, sidebar order, dashboard order, product-editor section order, notification preferences). The import endpoint validates the format header, refuses files over 1 MB, and sanitises every value against its declared WC field type before writing — so a hostile upload can never inject raw values into `wp_options`. The brand logo attachment id is intentionally skipped because it cannot transfer across sites. New `brikpanel_exportable_option_keys` filter for developers
* New: Drag-free section ordering in the simplified product editor — the previously-flat "Visible editor sections" multiselect under Settings → Products is now a sortable list with per-row up/down buttons and a visibility checkbox, so store owners can both hide and reorder every editor section (Images, Pricing, Inventory, Category, Tags, Digital, Description, Variations, SEO, Attributes, …) without touching code. Order is persisted as JSON and merged forward on plugin update so newly-introduced sections never silently disappear; hidden sections keep their slot so they slide back into place when re-enabled
* New: Backorder "Notify customer" sub-option — opt-in setting that surfaces WooCommerce's third backorder value (`notify`) in the simplified product editor. When "On backorder" is selected as the stock status, a CSS-Grid collapse reveals two radios (*Allow without notification* / *Allow and notify customer*); WC then writes a customer-visible note onto backordered line items at checkout. Works on both simple and variable products (variation rows expose the same control), and off by default so existing installs keep their two-value behaviour
* New: Quick-edit drawer now respects custom product taxonomies — a new opt-in setting surfaces any third-party product taxonomy (Brands from WooCommerce / Perfect WooCommerce Brands / YITH Brands, plus any custom `register_taxonomy` for the product post type) inside the slide-in quick-edit panel alongside Categories and Tags. Hierarchical taxonomies render as a checkbox tree, flat ones as a flat list, and capability checks (`assign_terms`) ensure editors without rights never see fields they can't save. Off by default; built-in cat/tag and attribute (`pa_*`) taxonomies are excluded since they already have dedicated UI
* Improvement: Virtual flag is now driven by the Downloadable toggle in the product editor — toggling "Digital (downloadable)" on automatically locks Virtual on and disables it, so the user can never end up in an inconsistent "downloadable but ships physically" state. Variations inherit the parent's Virtual + Downloadable flags so the lock applies uniformly across variable products

= 2.8.5 (2026-05-07) =
* New: BrikControl — Store Health module. A new "Store Health" surface (shield icon in the BrikPanel topbar + dashboard alert banner + dedicated `admin.php?page=brikpanel-brikcontrol` report page) audits every published and private product (and variation) and scores the store on two e-commerce-critical axes: oversized product images (>1 MB) and modern format coverage (WebP / AVIF). Each finding ships a clear recommendation — BrikPanel does NOT bundle its own image converter (that would needlessly bloat the plugin); instead it detects already-active optimizers (Smush, ShortPixel, Imagify, EWWW, Optimole, reSmush.it, LiteSpeed, WebP Express, Converter for Media, ShortPixel Adaptive Images, Jetpack Boost…) and, when none is found, surfaces a critical flag with a curated install list. Scans run in the background through Action Scheduler (200 products per batch, idle when not needed) and the topbar updates without leaving the page
* New: Vendor management settings under WooCommerce → Settings → BrikPanel → Vendors. New dedicated section pill exposes a master toggle for the Vendors / Stock Orders feature, a "Show vendor field in product editor" toggle (adds a Sourcing card with vendor + per-product vendor SKU; variations inherit the parent vendor unless overridden), a "Show vendor column on products list" toggle, the Stock Orders module toggle with a configurable PO reference prefix, and granular automations for the moment a purchase order is received (auto-increase WC stock, auto-update product cost / COGS with last-cost OR weighted-average method, auto-create matching expense entry under a configurable category). A "Settings" row is also injected into the top-level Vendors menu that links straight to the section
* New: Full WordPress Multisite compatibility — BrikPanel can now be network-activated to deploy a separate, fully-isolated dashboard on every subsite. Each subsite gets its own products, orders, vendors, stock orders, expenses, customer analytics tables, settings and Action Scheduler queue, with zero cross-site leakage. Network activation provisions every existing subsite immediately, and a `wp_initialize_site` hook back-fills tables / defaults the moment a new subsite is created on a network where BrikPanel is already active. Per-site activation continues to work unchanged on single-site WordPress
* Improvement: New products now default to the **Published** status in the BrikPanel product editor instead of "Draft". Auto-draft posts are surfaced as "publish" in the status dropdown so the very first save publishes the product without a second click — matching what most store owners expect. Existing drafts keep their current status untouched
* Improvement: Brand-new products now show a **Publish** button (instead of "Save") and clicking it actually publishes the product. The moment the first save succeeds, the action bar auto-injects the **View product**, **Duplicate** and **Add new** buttons next to the status dropdown — no page reload required. Previously these only appeared after a manual page refresh
* Improvement: Toggling **"Does this product have sizes/colors?"** on now hides the standalone **Product attributes** card while the variations wizard is open, so users no longer get confused between variation attributes (Size / Color) and spec attributes (Brand / Material). Switching the toggle back off restores the card immediately. Works on both simple→variable transitions and existing variable products
* Fix: The product list **Sort** dropdown now correctly re-orders products when a specific category is selected. Previously, filtering by category and changing the sort order in the same session left the table on the previous ordering because rapid filter+sort changes raced each other; in-flight requests are now aborted when a newer one is fired, so the visible ordering always matches the dropdown — for both simple and variable products

= 2.7.2 (2026-05-04) =
* New: Sidebar navigation customizer "More menu" section — top-level WordPress admin menu items (and custom links) can now be promoted into the BrikPanel "More" dropdown alongside the native WooCommerce submenus, instead of only living in the top "Store" or "Site management" groups. Drag any row from WooCommerce → Settings → BrikPanel → Navigation into the new third section and it renders as a child of "More" on the sidebar, with the existing WC submenu structure (Reports, Status, Extensions, …) preserved
* New: Per-submenu visibility toggles in the customizer — every system row now expands into a collapsible panel that lists its individual WordPress submenu children (e.g. Users → All Users, Add User, Profile) with a small toggle next to each one. Hidden children disappear from the BrikPanel sidebar hover/expand menu without removing the parent
* New: Custom icon override for system items — every system row now has a "Change icon" button that opens the icon picker dialog and replaces the default WordPress dashicon with one of the curated BrikPanel SVG icons (25+ options); a "Use original" button restores the dashicon. Previously only user-added custom links could pick from this icon set
* Improvement: Customizer config schema is forward-compatible — existing saved configs continue to work without `submenus` / `icon_override` fields, and the snapshot now collects all submenu children (with WC promotion/skip filters applied) so newly-installed plugins surface their child items automatically

= 2.7.0 (2026-05-04) =
* New: Sidebar navigation customizer — every item in the BrikPanel left menu (both the top "Store" group and the "Site management" group below the heading) can now be reordered via drag-and-drop, hidden, or extended with custom internal/external links from WooCommerce → Settings → BrikPanel → Navigation. Configuration is stored as JSON in a single option and newly-installed plugins auto-append at the end so they always remain visible after an update
* New: Dashboard section visibility — the "Dashboard" settings section now exposes a multiselect that lets store owners pick exactly which cards render on the BrikPanel dashboard (KPI cards, sales chart + live visitors, conversion funnel + order rates, locations globe, top products + recent orders, most viewed pages + add-to-cart, devices + customer types, RFM segments, low stock + LTV, subscriptions, marketplace analytics, WordPress widgets). Empty selection means "show everything", so existing installs keep their full dashboard
* New: Storefront product ordering from the BrikPanel product list — a new "Sort" toggle in the toolbar enables drag-and-drop reordering of products with a handle column, and a "Custom order" entry has been added to the sort dropdown so the saved order is also browseable inside the panel. Reordering writes directly to `wp_posts.menu_order` so the new sequence applies on the storefront immediately, with collisions tie-broken by title
* New: Admin interface appearance customization — a new "Appearance" section in BrikPanel settings lets you change the UI font (System default + nine curated Google Fonts: Inter, Poppins, Roboto, Manrope, DM Sans, Plus Jakarta Sans, Nunito, Work Sans) and the primary/accent color used across the dashboard, top bar, sidebar, products, orders, coupons, segments, expenses, customer analytics, product editor and the modern login page. Google fonts are loaded with `display: swap` and a `preconnect` hint, and skipped entirely when "System default" is selected so no outbound request is ever made by default
* New: Full RTL support — a dedicated `assets/css/brikpanel-rtl.css` override stylesheet (~860 lines, all rules scoped under `body.rtl`) is enqueued at priority 999 only when WordPress reports an RTL locale (Arabic, Hebrew, Persian, Urdu, …), so the entire BrikPanel UI flips direction cleanly — dashboard, products list, product editor, orders, coupons, segments, expenses, customer analytics, top bar, sidebar nav, login page, modals and toast notifications
* Improvement: BrikPanel settings page reorganized into a Shopify-style sub-navigation — the previously single long page is now split into focused sections (General, Navigation, Dashboard, Products, Orders, Coupons, Login page, Notifications, Developers) so admins land on one topic at a time. Each section's title + description + form-table block is wrapped into a single visual card; third-party fields injected via the public `brikpanel_settings_fields` filter are still respected
* Fix: Cmd/Ctrl + K order search no longer leaves a phantom empty WordPress Command Palette open behind the BrikPanel overlay. The keydown listener is now registered in the capture phase with `stopImmediatePropagation()` so WordPress core's `commands-command-menu` (which binds the same shortcut) never fires, and closing the BrikPanel search via Escape no longer reveals an empty WP search modal underneath
* Fix: The "X" close button on the bulk-update modal in the products page now closes the modal correctly — the click handler had only been bound to the bottom "Cancel" button, leaving the top-right close icon inert. Both controls are now wired to the same `closeBulkModal` handler

= 2.6.1 (2026-04-28) =
* New: Live store summary — BrikPanel now generates a continuously updated `brikpanel-store-summary.md` file that captures every metric the panel collects (sales, orders, AOV, conversion rate, top products, top countries, customer LTV / RFM / cohort highlights, inventory health and more) in a compact, human-readable format. Designed for two flows: paste it into any AI chat for instant store interpretation, or hand it to a data analyst, accountant or investor as a one-page snapshot of the whole shop
* New: Cache plugin integration on the BrikPanel top admin bar — when WP Rocket, LiteSpeed Cache, W3 Total Cache, WP Super Cache, WP Fastest Cache, Cache Enabler, Hummingbird, Comet Cache, Breeze, Autoptimize, SG Optimizer, Swift Performance or Nginx Helper is active, a "Clear cache" button appears in the top bar and purges the detected provider in one click
* New: Quick edit "Downloadable" toggle for virtual / digital products in the product list — when a product is digital, the slide-in quick edit now exposes the downloadable switch so digital products can be flipped without opening the full product editor (works for both simple and variable products)
* New: Gutenberg compatibility — the simplified product editor and the BrikPanel order screens now coexist cleanly with the block editor, including stores that have Gutenberg forced on for `product` post type
* Improvement: Digital product settings (Virtual / Downloadable / Files / Download limits) are now positioned above the description and short description fields in the product editor — the most relevant toggles for digital sellers are visible without scrolling
* Fix: "Top Countries by Orders" and "Top Countries by Customers" dashboard cards now show accurate values — the previous query joined the wrong address table on HPOS stores and double-counted shipping/billing entries on legacy stores. Both code paths have been rewritten and the totals now match `wc_get_orders` and the customer table exactly
* Fix: "Visitors by Device" dashboard widget data source corrected — device classification is now derived from the stored User-Agent on the `wp_brikpanel_visitors` table (not from a stale transient), so desktop / mobile / tablet shares match the visitor log row-for-row

= 2.5.3 (2026-04-25) =
* New: Full SEO plugin compatibility — Yoast SEO, Rank Math, All in One SEO and SEOPress metaboxes (including the SEO score panel) now render and save inside the BrikPanel product editor, with all of their features available from the simplified screen
* New: Custom BrikPanel-styled top admin bar that replaces the default WordPress toolbar across the entire admin (not only the dashboard) with a larger, e-commerce-focused notification bell and quick links — enabled by default and toggleable from settings
* New: Sold downloadable products column on the order edit page — see how many times each download has been redeemed by the customer, like the legacy panel used to show
* New: BrikMarket marketplace analytics block on the dashboard — when BrikMarket is active, marketplace orders are excluded from the storefront conversion rate and a dedicated section shows orders per marketplace, share by marketplace, and top categories from marketplace orders
* New: Compatibility with major subscription / membership plugins — WooCommerce Subscriptions, Subscriptions for WooCommerce (WP Swings), MemberPress, Paid Memberships Pro, WooCommerce Memberships, YITH WooCommerce Subscription, SUMO Subscriptions, WebToffee Subscriptions for WooCommerce and Restrict Content Pro
* New: Advanced filtering and segmentation for customers and orders — combine spend range, product, location, date and more to build saved segments
* New: Customer analytics suite — Cohort retention, Customer Lifetime Value (LTV) and RFM segmentation, all calculated from your store data and visualized in the dashboard
* New: Developer hooks & filters system — `brikpanel_after_product_save` action, `brikpanel_product_editor_boxes` filter and many more, with a built-in developer documentation popup in settings (one-click copy buttons for every snippet)
* New: Brand field in the refactored product editor — the WooCommerce `product_brand` taxonomy is now first-class alongside categories and tags
* New: Admin and Site Enhancements (ASE) custom columns are now respected in the BrikPanel product, order and customer lists
* New: Per-user toggles for any third-party / SEO column in the products list — extra columns added by Yoast, Rank Math, ASE and other plugins can now be hidden from the existing "Columns" dropdown
* Improvement: Hardened performance for low-resource WooCommerce hosting — heavy queries are batched, cached and run through Action Scheduler so the dashboard, customer analytics and bulk editor stay responsive on shared hosting
* Improvement: All JavaScript and jQuery strings audited for translation — every customer-facing message in the JS layer now goes through `wp_localize_script` so translators no longer miss strings hidden in scripts
* Fix: Sidebar menu no longer flickers / disappears on upward scroll — the sticky positioning CSS that fought with the new top bar has been corrected
* Fix: Variation tab no longer loses unsaved state when navigating back — the editor now restores the in-progress variation form without needing to close and reopen the product
* Fix: PHP notice raised when the refactored product editor module was disabled in settings is now resolved
* Fix: "Top Marketplace Products" and "Top Categories from Marketplaces" cards now correctly render data for the selected date range (last 30 days and custom ranges)
* Fix: Removed the redundant "Storefront metrics shown below exclude marketplace orders…" helper notice now that marketplace data has its own dedicated section

= 2.2.1 (2026-04-24) =
* Improvement: "Force native login submission" is now enabled by default so custom authentication plugins (2FA, SSO, or captcha layers) keep working on a fresh install without extra configuration. Existing sites keep their current setting
* Fix: Newly created categories in the simplified product editor now reflect instantly in the checklist and parent dropdown with correct hierarchy, depth indentation, and alphabetical ordering — previously the new entry was appended flat at the end and missed the depth class, and the first category on a product with none at all was silently dropped

= 2.2.0 (2026-04-20) =
* Improvement: New "Force native login submission" toggle under WooCommerce → Settings → BrikPanel → Login Page for custom authentication plugins that aren't auto-detected, plus a `brikpanel_disable_ajax_login` filter hook for developers. When any of these conditions trigger, the AJAX login endpoint is no longer registered at all, reducing the attack surface

= 2.1.6 (2026-04-20) =
* New: "Private" status filter on the product list — quickly isolate products that are published privately alongside the existing All / Published / Draft / Trash tabs
* New: Hover popover for the Category column in the product list — the main category stays inline and a "+N" badge reveals every remaining category on hover, so products assigned to multiple categories no longer hide their taxonomy
* New: Visual / HTML toggle on both the short description and full description editors in the simplified product editor — paste raw HTML without losing formatting, switch back to the rich-text view at any time
* Improvement: ACF (Advanced Custom Fields) and other third-party metabox compatibility hardened — ACF field groups targeting the `product` post type now bootstrap, render, and save correctly on the BrikPanel product editor (file, image, gallery, repeater, true/false and text fields all tested). The `_acf_nonce` / `_acf_post_id` payload is emitted so save round-trips validate. Applies to both simple and variable products
* Improvement: "Additional fields" / third-party metabox card redesigned — inputs no longer overflow the right edge of the card, JavaScript-driven fields (ACF, custom pickers) receive their init payload, and text/number inputs are now fully editable across every registered metabox
* Improvement: Category list rows on the categories page are now more compact — reduced vertical padding and tighter line-height so more categories fit on screen without scrolling
* Improvement: Downloadable product file URLs are now editable in place — the file input accepts direct edits and the media library browse button replaces the existing file instead of requiring a delete-and-reupload cycle
* Improvement: Custom login page is now fully compatible with 2FA and SSO plugins — when Wordfence Login Security, Two Factor, WP 2FA, miniOrange, Solid Security, Duo, Rublon, or Google Authenticator is active, BrikPanel keeps its modern styling but hands the form submit to the native `wp-login.php` flow so multi-step authentication works exactly as the plugin author intended. Closes a silent 2FA bypass where AJAX login could skip a redirect-based challenge page

= 2.1.5 (2026-04-17) =
* New: Inline stock-status toggle in the product list — flip "In stock / Out of stock" directly from the row without opening a popup, for both simple and variable products
* New: "Columns" dropdown above the product list — hide the columns you don't need (SKU, Price, Stock, Category, Status, Image) and the preference is remembered per user
* New: WordPress widgets position setting for the dashboard — display the embedded WP widgets section above or below BrikPanel analytics (handy for shop managers who rely on widget shortcuts)
* New: `brikpanel_dashboard_section_order` filter hook — developers can reorder any dashboard section via a snippet
* New: `brikpanel_products_columns` filter hook — register custom columns in the product list
* Improvement: Login page AJAX falls back to the native WordPress submit flow when the AJAX endpoint is blocked (e.g. WP Hide / security plugins renaming `admin-ajax.php`), so users are no longer stuck on a generic "An error occurred" message
* Improvement: Login page toast notifications are now centered at the top of the screen for better visibility
* Improvement: Admin notice suppression now also runs on the BrikPanel settings tab — third-party marketing notices no longer leak onto the settings page
* Improvement: WooCommerce's generic "Your settings have been saved" banner is replaced with a branded BrikPanel confirmation on the settings tab
* Improvement: Variable-product stock-status changes now propagate to every variation and the WooCommerce meta lookup table, so flipping a variable product off actually makes it unavailable on the storefront

= 2.1.0 (2026-04-16) =
* New: Admin notice suppression — hides third-party plugin notices on BrikPanel pages for a cleaner, distraction-free admin experience (toggleable from settings)
* New: Product tags support in the simplified product editor with autocomplete suggestions
* New: Cost of Goods Sold (COGS) field support when enabled in WooCommerce settings
* Improvement: Enhanced SEO plugin compatibility — Yoast SEO, Rank Math, AIOSEO, and SEOPress metaboxes now load correctly on the BrikPanel product editor
* Improvement: Better admin body class handling for modern product edit and classic navigation modes

= 2.0.7 (2026-04-12) =
* Comprehensive settings have been added to the product editing page.

= 2.0.4 (2026-04-09) =
* Add Digital product support

= 2.0.1 (2026-04-08) =
* Bug fix: The "Live Visitors" section was scrolling to the right

= 2.0.0 (2026-04-08) =
* New: Modern WooCommerce dashboard rebuilt from scratch with real-time sales analytics, conversion funnel, order status donut, and 3D geographic globe
* New: WooCommerce live visitors widget with cart status and current page
* New: Cmd/Ctrl + K lightning-fast order search across ID, name, email, phone, and SKU
* New: Modern WooCommerce order management page with 30-day overview bar and inline status change
* New: WooCommerce product list plugin with AJAX pagination, live search, and one-click publish toggle
* New: Quick edit sidebar for inline product editing without leaving the list
* New: WooCommerce bulk editor with full variation support — bulk edit variation prices, bulk update variation stock, percentage and fixed-amount updates, by category or selected products
* New: WooCommerce variation price editor modal with attribute filtering
* New: Simplified WooCommerce product editor with drag-and-drop image upload, searchable category picker, live SEO preview, and auto-generated variations
* New: WooCommerce variation gallery — separate image gallery per variation
* New: WooCommerce categories page with drag-and-drop parent/child nesting
* New: Best-in-class free WooCommerce coupon manager with slide-over panel and one-click duplicate
* New: Custom WP login page (WordPress login customizer) with AJAX submission
* New: Sound notifications and confetti celebrations on new completed orders
* New: Welcome / onboarding modal for first-run experience
* New: WooCommerce sales by country and city with interactive 3D globe
* New: WooCommerce conversion tracking with full visitor → cart → checkout → order funnel
* New: Two custom order statuses — Return Draft and Change
* New: Optional simplified admin mode that hides the full WordPress menu for non-technical clients
* Improvement: Full HPOS (High-Performance Order Storage) compatibility with dual code paths on every order query
* Improvement: All AJAX endpoints hardened with nonce + capability checks
* Improvement: IP addresses now SHA-256 hashed before storage for privacy
* Improvement: Admin users excluded from all analytics to keep numbers clean
* Improvement: Tested up to WordPress 6.9 and WooCommerce 9.x

= 1.5.0 (2026-03-01) =
* Improvement: Simplified licensing — all features now completely free

= 1.4.1 (2026-02-15) =
* Bug fix: Yesterday date range calculation corrected in dashboard widgets

= 1.3.5 (2026-01-20) =
* Bug fix: Order conversion rate calculation accuracy improved

= 1.3.4 (2026-01-10) =
* New feature: Added new dashboard widgets for enhanced store insights

= 1.3.3 (2025-12-15) =
* Bug fix: Order count display corrected for filtered views

= 1.3.2 (2025-12-01) =
* Bug fix: Resolved Slider Revolution CSS color conflict

= 1.2.9 (2025-11-15) =
* Bug fix: Resolved compatibility issues on stores without HPOS enabled

= 1.2.6 (2025-11-01) =
* Bug fix: Product category addition issue resolved

= 1.2.3 (2025-10-15) =
* Improvement: Full translation support added with .pot file

= 1.2.2 (2025-10-01) =
* Bug fix: Admin Menu Editor compatibility restored

= 1.2.0 (2025-09-15) =
* Improvement: WooCommerce 9.4 compatibility
* Improvement: Redesigned UI with enhanced navigation
* Bug fix: Various minor fixes
