{"id":226093,"date":"2025-03-26T20:51:33","date_gmt":"2025-03-26T20:51:33","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/brikpanel-admin-panel-dashboard-for-woocommerce\/"},"modified":"2026-08-27T10:12:25","modified_gmt":"2026-08-27T10:12:25","slug":"brikpanel-admin-panel-dashboard-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/es-cr.wordpress.org\/plugins\/brikpanel-admin-panel-dashboard-for-woocommerce\/","author":21214773,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.2.84","stable_tag":"3.2.84","tested":"7.0.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"BrikPanel: WooCommerce Admin Dashboard Theme","header_author":"Brksoft","header_description":"Beautiful and modern admin panel dashboard for WooCommerce","assets_banners_color":"d3d3d3","last_updated":"2026-08-27 10:12:25","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/donate.stripe.com\/14AdR9ghJcxKaAqdzbc3m00","header_plugin_uri":"","header_author_uri":"https:\/\/brksoft.com\/","rating":5,"author_block_rating":0,"active_installs":900,"downloads":27901,"num_ratings":40,"support_threads":59,"support_threads_resolved":56,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.5":{"tag":"1.1.5","author":"brksoft","date":"2025-03-26 20:51:12","revision":3262425},"1.1.6":{"tag":"1.1.6","author":"brksoft","date":"2025-03-27 14:36:46","revision":3262917},"1.1.7":{"tag":"1.1.7","author":"brksoft","date":"2025-03-27 14:46:41","revision":3262924},"1.1.8":{"tag":"1.1.8","author":"brksoft","date":"2025-03-28 06:46:44","revision":3263269},"1.1.9":{"tag":"1.1.9","author":"brksoft","date":"2025-03-31 11:36:00","revision":3264402},"1.2.0":{"tag":"1.2.0","author":"brksoft","date":"2025-04-03 10:54:12","revision":3266267},"1.2.1":{"tag":"1.2.1","author":"brksoft","date":"2025-04-06 19:08:18","revision":3267542},"1.2.2":{"tag":"1.2.2","author":"brksoft","date":"2025-04-14 00:16:27","revision":3271960},"1.2.3":{"tag":"1.2.3","author":"brksoft","date":"2025-05-02 11:03:13","revision":3286174},"1.2.4":{"tag":"1.2.4","author":"brksoft","date":"2025-05-06 09:55:52","revision":3288337},"1.2.5":{"tag":"1.2.5","author":"brksoft","date":"2025-05-06 10:03:56","revision":3288346},"1.2.6":{"tag":"1.2.6","author":"brksoft","date":"2025-05-12 15:58:13","revision":3292015},"1.2.7":{"tag":"1.2.7","author":"brksoft","date":"2025-05-27 16:52:20","revision":3301667},"1.2.8":{"tag":"1.2.8","author":"brksoft","date":"2025-05-27 17:03:06","revision":3301679},"1.2.9":{"tag":"1.2.9","author":"brksoft","date":"2025-06-04 11:00:59","revision":3306328},"1.3.0":{"tag":"1.3.0","author":"brksoft","date":"2025-06-25 16:27:59","revision":3317779},"1.3.1":{"tag":"1.3.1","author":"brksoft","date":"2025-07-08 09:03:38","revision":3324160},"1.3.2":{"tag":"1.3.2","author":"brksoft","date":"2025-07-09 08:11:49","revision":3324797},"1.3.3":{"tag":"1.3.3","author":"brksoft","date":"2025-10-14 11:15:15","revision":3378067},"1.4.2":{"tag":"1.4.2","author":"brksoft","date":"2026-01-13 05:54:20","revision":3438321},"1.4.3":{"tag":"1.4.3","author":"brksoft","date":"2026-01-13 06:07:33","revision":3438327},"1.4.5":{"tag":"1.4.5","author":"brksoft","date":"2026-01-13 11:41:16","revision":3438547},"1.4.6":{"tag":"1.4.6","author":"brksoft","date":"2026-03-14 13:57:33","revision":3482555},"1.5.1":{"tag":"1.5.1","author":"brksoft","date":"2026-04-02 16:01:47","revision":3497645},"2.0.0":{"tag":"2.0.0","author":"brksoft","date":"2026-04-08 18:39:28","revision":3501926},"2.0.1":{"tag":"2.0.1","author":"brksoft","date":"2026-04-08 19:22:22","revision":3501947},"2.0.2":{"tag":"2.0.2","author":"brksoft","date":"2026-04-09 11:07:04","revision":3502399},"2.0.3":{"tag":"2.0.3","author":"brksoft","date":"2026-04-10 14:34:11","revision":3503370},"2.0.4":{"tag":"2.0.4","author":"brksoft","date":"2026-04-10 16:28:51","revision":3503441},"2.0.5":{"tag":"2.0.5","author":"brksoft","date":"2026-04-12 09:15:16","revision":3504346},"2.0.6":{"tag":"2.0.6","author":"brksoft","date":"2026-04-13 11:56:34","revision":3505119},"2.0.7":{"tag":"2.0.7","author":"brksoft","date":"2026-04-13 11:56:34","revision":3505119},"2.1.0":{"tag":"2.1.0","author":"brksoft","date":"2026-04-16 14:33:55","revision":3508184},"2.1.1":{"tag":"2.1.1","author":"brksoft","date":"2026-04-17 07:39:15","revision":3508648},"2.1.2":{"tag":"2.1.2","author":"brksoft","date":"2026-04-17 19:46:56","revision":3509246},"2.1.3":{"tag":"2.1.3","author":"brksoft","date":"2026-04-18 15:34:29","revision":3509677},"2.1.4":{"tag":"2.1.4","author":"brksoft","date":"2026-04-18 16:39:39","revision":3509701},"2.1.5":{"tag":"2.1.5","author":"brksoft","date":"2026-04-19 19:44:18","revision":3510247},"2.1.6":{"tag":"2.1.6","author":"brksoft","date":"2026-04-20 14:00:14","revision":3510941},"2.1.7":{"tag":"2.1.7","author":"brksoft","date":"2026-04-20 17:01:47","revision":3511073},"2.1.8":{"tag":"2.1.8","author":"brksoft","date":"2026-04-22 09:03:25","revision":3512582},"2.5.0":{"tag":"2.5.0","author":"brksoft","date":"2026-04-25 21:03:55","revision":3515470},"2.5.2":{"tag":"2.5.2","author":"brksoft","date":"2026-04-27 18:54:32","revision":3516752},"2.5.3":{"tag":"2.5.3","author":"brksoft","date":"2026-04-28 10:14:43","revision":3517225},"2.6.0":{"tag":"2.6.0","author":"brksoft","date":"2026-04-28 17:41:24","revision":3517702},"2.6.1":{"tag":"2.6.1","author":"brksoft","date":"2026-04-29 12:46:23","revision":3518446},"2.7.0":{"tag":"2.7.0","author":"brksoft","date":"2026-05-04 14:15:02","revision":3522455},"2.7.1":{"tag":"2.7.1","author":"brksoft","date":"2026-05-04 16:29:05","revision":3522567},"2.8.0":{"tag":"2.8.0","author":"brksoft","date":"2026-05-07 16:42:37","revision":3525814},"2.8.1":{"tag":"2.8.1","author":"brksoft","date":"2026-05-07 17:12:57","revision":3525838},"2.8.2":{"tag":"2.8.2","author":"brksoft","date":"2026-05-08 16:28:44","revision":3526723},"2.8.3":{"tag":"2.8.3","author":"brksoft","date":"2026-05-09 13:46:45","revision":3527233},"2.8.4":{"tag":"2.8.4","author":"brksoft","date":"2026-05-09 20:28:39","revision":3527412},"2.8.5":{"tag":"2.8.5","author":"brksoft","date":"2026-05-10 07:52:04","revision":3527619},"2.8.6":{"tag":"2.8.6","author":"brksoft","date":"2026-05-11 18:01:49","revision":3529056},"2.9.2":{"tag":"2.9.2","author":"brksoft","date":"2026-05-13 19:01:50","revision":3531324},"2.9.3":{"tag":"2.9.3","author":"brksoft","date":"2026-05-13 19:01:50","revision":3531324},"2.9.4":{"tag":"2.9.4","author":"brksoft","date":"2026-05-13 19:01:50","revision":3531324},"3.0.0":{"tag":"3.0.0","author":"brksoft","date":"2026-05-15 11:28:10","revision":3532942},"3.0.1":{"tag":"3.0.1","author":"brksoft","date":"2026-05-17 14:53:09","revision":3534620},"3.0.2":{"tag":"3.0.2","author":"brksoft","date":"2026-05-17 19:16:49","revision":3534794},"3.0.3":{"tag":"3.0.3","author":"brksoft","date":"2026-05-18 06:29:27","revision":3535120},"3.0.4":{"tag":"3.0.4","author":"brksoft","date":"2026-05-18 20:21:14","revision":3536280},"3.0.5":{"tag":"3.0.5","author":"brksoft","date":"2026-05-19 07:02:45","revision":3536747},"3.0.6":{"tag":"3.0.6","author":"brksoft","date":"2026-05-19 16:24:56","revision":3537668},"3.0.7":{"tag":"3.0.7","author":"brksoft","date":"2026-05-20 18:26:13","revision":3539854},"3.0.8":{"tag":"3.0.8","author":"brksoft","date":"2026-05-21 17:18:57","revision":3542467},"3.0.9":{"tag":"3.0.9","author":"brksoft","date":"2026-05-22 14:25:27","revision":3543992},"3.1.0":{"tag":"3.1.0","author":"brksoft","date":"2026-05-25 09:12:18","revision":3547215},"3.1.1":{"tag":"3.1.1","author":"brksoft","date":"2026-05-26 05:45:53","revision":3548579},"3.1.10":{"tag":"3.1.10","author":"brksoft","date":"2026-06-03 19:32:39","revision":3559925},"3.1.11":{"tag":"3.1.11","author":"brksoft","date":"2026-06-04 18:38:27","revision":3561425},"3.1.12":{"tag":"3.1.12","author":"brksoft","date":"2026-06-06 06:41:28","revision":3562960},"3.1.13":{"tag":"3.1.13","author":"brksoft","date":"2026-06-06 12:59:49","revision":3563145},"3.1.14":{"tag":"3.1.14","author":"brksoft","date":"2026-06-08 14:05:00","revision":3564815},"3.1.15":{"tag":"3.1.15","author":"brksoft","date":"2026-06-09 11:08:46","revision":3565866},"3.1.16":{"tag":"3.1.16","author":"brksoft","date":"2026-06-10 05:52:51","revision":3566862},"3.1.17":{"tag":"3.1.17","author":"brksoft","date":"2026-06-10 16:37:27","revision":3567828},"3.1.19":{"tag":"3.1.19","author":"brksoft","date":"2026-06-12 08:27:01","revision":3569758},"3.1.2":{"tag":"3.1.2","author":"brksoft","date":"2026-05-29 07:29:26","revision":3553095},"3.1.21":{"tag":"3.1.21","author":"brksoft","date":"2026-06-12 09:39:42","revision":3569857},"3.1.23":{"tag":"3.1.23","author":"brksoft","date":"2026-06-13 19:04:02","revision":3571288},"3.1.24":{"tag":"3.1.24","author":"brksoft","date":"2026-06-14 10:36:26","revision":3571761},"3.1.25":{"tag":"3.1.25","author":"brksoft","date":"2026-06-15 11:09:21","revision":3572962},"3.1.28":{"tag":"3.1.28","author":"brksoft","date":"2026-06-15 16:33:46","revision":3573437},"3.1.29":{"tag":"3.1.29","author":"brksoft","date":"2026-06-17 12:20:23","revision":3575784},"3.1.3":{"tag":"3.1.3","author":"brksoft","date":"2026-05-29 07:56:17","revision":3553118},"3.1.30":{"tag":"3.1.30","author":"brksoft","date":"2026-06-17 17:54:24","revision":3576217},"3.1.31":{"tag":"3.1.31","author":"brksoft","date":"2026-06-18 14:12:57","revision":3577312},"3.1.32":{"tag":"3.1.32","author":"brksoft","date":"2026-06-21 10:16:30","revision":3580501},"3.1.33":{"tag":"3.1.33","author":"brksoft","date":"2026-06-22 16:23:19","revision":3582057},"3.1.34":{"tag":"3.1.34","author":"brksoft","date":"2026-06-23 17:27:51","revision":3583590},"3.1.35":{"tag":"3.1.35","author":"brksoft","date":"2026-06-23 19:27:06","revision":3583708},"3.1.36":{"tag":"3.1.36","author":"brksoft","date":"2026-06-24 18:49:02","revision":3585265},"3.1.37":{"tag":"3.1.37","author":"brksoft","date":"2026-06-25 11:26:41","revision":3586088},"3.1.38":{"tag":"3.1.38","author":"brksoft","date":"2026-06-25 18:31:27","revision":3586476},"3.1.39":{"tag":"3.1.39","author":"brksoft","date":"2026-06-26 06:25:21","revision":3586836},"3.1.4":{"tag":"3.1.4","author":"brksoft","date":"2026-05-29 15:58:36","revision":3553798},"3.1.40":{"tag":"3.1.40","author":"brksoft","date":"2026-06-27 10:14:04","revision":3587994},"3.1.41":{"tag":"3.1.41","author":"brksoft","date":"2026-06-27 18:18:27","revision":3588267},"3.1.42":{"tag":"3.1.42","author":"brksoft","date":"2026-06-28 18:35:17","revision":3589139},"3.1.43":{"tag":"3.1.43","author":"brksoft","date":"2026-06-29 11:00:20","revision":3589936},"3.1.44":{"tag":"3.1.44","author":"brksoft","date":"2026-06-29 11:54:16","revision":3590027},"3.1.45":{"tag":"3.1.45","author":"brksoft","date":"2026-06-30 13:25:55","revision":3591562},"3.1.46":{"tag":"3.1.46","author":"brksoft","date":"2026-06-30 20:06:48","revision":3591917},"3.1.47":{"tag":"3.1.47","author":"brksoft","date":"2026-07-02 18:47:57","revision":3594389},"3.1.5":{"tag":"3.1.5","author":"brksoft","date":"2026-05-30 18:47:49","revision":3554956},"3.1.51":{"tag":"3.1.51","author":"brksoft","date":"2026-07-06 09:27:49","revision":3597500},"3.1.6":{"tag":"3.1.6","author":"brksoft","date":"2026-05-30 18:47:49","revision":3554956},"3.1.8":{"tag":"3.1.8","author":"brksoft","date":"2026-06-01 13:42:07","revision":3556824},"3.1.9":{"tag":"3.1.9","author":"brksoft","date":"2026-06-03 05:17:39","revision":3558800},"3.2.0":{"tag":"3.2.0","author":"brksoft","date":"2026-07-06 10:16:07","revision":3597574},"3.2.1":{"tag":"3.2.1","author":"brksoft","date":"2026-07-06 10:45:44","revision":3597606},"3.2.10":{"tag":"3.2.10","author":"brksoft","date":"2026-07-13 12:21:33","revision":3606020},"3.2.11":{"tag":"3.2.11","author":"brksoft","date":"2026-07-13 16:15:42","revision":3606397},"3.2.12":{"tag":"3.2.12","author":"brksoft","date":"2026-07-14 10:12:18","revision":3607251},"3.2.15":{"tag":"3.2.15","author":"brksoft","date":"2026-07-15 10:44:07","revision":3608677},"3.2.16":{"tag":"3.2.16","author":"brksoft","date":"2026-07-17 11:29:55","revision":3611408},"3.2.17":{"tag":"3.2.17","author":"brksoft","date":"2026-07-17 11:46:40","revision":3611429},"3.2.19":{"tag":"3.2.19","author":"brksoft","date":"2026-07-19 11:31:49","revision":3613495},"3.2.20":{"tag":"3.2.20","author":"brksoft","date":"2026-07-19 11:47:40","revision":3613519},"3.2.21":{"tag":"3.2.21","author":"brksoft","date":"2026-07-20 13:28:41","revision":3614800},"3.2.22":{"tag":"3.2.22","author":"brksoft","date":"2026-07-21 12:57:19","revision":3617191},"3.2.23":{"tag":"3.2.23","author":"brksoft","date":"2026-07-22 08:40:06","revision":3618216},"3.2.27":{"tag":"3.2.27","author":"brksoft","date":"2026-07-23 13:58:08","revision":3620101},"3.2.28":{"tag":"3.2.28","author":"brksoft","date":"2026-07-26 11:40:21","revision":3623314},"3.2.29":{"tag":"3.2.29","author":"brksoft","date":"2026-07-28 08:51:48","revision":3625638},"3.2.3":{"tag":"3.2.3","author":"brksoft","date":"2026-07-07 19:28:43","revision":3599526},"3.2.30":{"tag":"3.2.30","author":"brksoft","date":"2026-07-30 08:47:58","revision":3628225},"3.2.33":{"tag":"3.2.33","author":"brksoft","date":"2026-08-02 06:37:36","revision":3631550},"3.2.34":{"tag":"3.2.34","author":"brksoft","date":"2026-08-03 05:24:13","revision":3632329},"3.2.35":{"tag":"3.2.35","author":"brksoft","date":"2026-08-04 13:48:54","revision":3634238},"3.2.36":{"tag":"3.2.36","author":"brksoft","date":"2026-08-06 09:18:51","revision":3636361},"3.2.4":{"tag":"3.2.4","author":"brksoft","date":"2026-07-08 11:42:26","revision":3600229},"3.2.42":{"tag":"3.2.42","author":"brksoft","date":"2026-08-09 11:01:40","revision":3639294},"3.2.43":{"tag":"3.2.43","author":"brksoft","date":"2026-08-10 15:43:26","revision":3640805},"3.2.44":{"tag":"3.2.44","author":"brksoft","date":"2026-08-10 15:59:39","revision":3640827},"3.2.5":{"tag":"3.2.5","author":"brksoft","date":"2026-07-08 17:44:12","revision":3600637},"3.2.6":{"tag":"3.2.6","author":"brksoft","date":"2026-07-09 09:58:54","revision":3601281},"3.2.60":{"tag":"3.2.60","author":"brksoft","date":"2026-08-13 18:24:54","revision":3645999},"3.2.63":{"tag":"3.2.63","author":"brksoft","date":"2026-08-14 15:32:21","revision":3647636},"3.2.68":{"tag":"3.2.68","author":"brksoft","date":"2026-08-15 15:16:11","revision":3648769},"3.2.69":{"tag":"3.2.69","author":"brksoft","date":"2026-08-15 18:37:33","revision":3648938},"3.2.7":{"tag":"3.2.7","author":"brksoft","date":"2026-07-10 10:36:33","revision":3602587},"3.2.70":{"tag":"3.2.70","author":"brksoft","date":"2026-08-16 17:06:52","revision":3649954},"3.2.71":{"tag":"3.2.71","author":"brksoft","date":"2026-08-17 11:43:03","revision":3651052},"3.2.72":{"tag":"3.2.72","author":"brksoft","date":"2026-08-17 16:31:50","revision":3651421},"3.2.73":{"tag":"3.2.73","author":"brksoft","date":"2026-08-18 09:44:23","revision":3652420},"3.2.75":{"tag":"3.2.75","author":"brksoft","date":"2026-08-19 19:02:14","revision":3655201},"3.2.76":{"tag":"3.2.76","author":"brksoft","date":"2026-08-21 11:07:10","revision":3658843},"3.2.77":{"tag":"3.2.77","author":"brksoft","date":"2026-08-21 15:18:19","revision":3659272},"3.2.78":{"tag":"3.2.78","author":"brksoft","date":"2026-08-21 17:16:12","revision":3659430},"3.2.8":{"tag":"3.2.8","author":"brksoft","date":"2026-07-11 15:59:04","revision":3604118},"3.2.80":{"tag":"3.2.80","author":"brksoft","date":"2026-08-24 19:11:37","revision":3664142},"3.2.84":{"tag":"3.2.84","author":"brksoft","date":"2026-08-27 10:12:25","revision":3668564},"3.2.9":{"tag":"3.2.9","author":"brksoft","date":"2026-07-12 07:32:52","revision":3604509}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":40},"assets_icons":{"icon-128x128.gif":{"filename":"icon-128x128.gif","revision":3501915,"resolution":"128x128","location":"assets","locale":"","width":1280,"height":1280},"icon-256x256.gif":{"filename":"icon-256x256.gif","revision":3501915,"resolution":"256x256","location":"assets","locale":"","width":1280,"height":1280}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3534620,"resolution":"772x250","location":"assets","locale":"","width":2316,"height":750}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3668564,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"meta\":{\"title\":\"BrikPanel Live Preview\",\"description\":\"WooCommerce admin dashboard, sales report, COGS, ad spend, ROAS, net profit, RFM and cohort analytics, pre-seeded with a full demo store.\",\"author\":\"brksoft\",\"categories\":[\"ecommerce\",\"admin\"]},\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=brikpanel-dashboard\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"features\":{\"networking\":true},\"login\":true,\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"woocommerce\"},\"options\":{\"activate\":true}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"brikpanel-admin-panel-dashboard-for-woocommerce\"},\"options\":{\"activate\":true}},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"BrikPanel Demo Store\",\"woocommerce_currency\":\"USD\",\"woocommerce_default_country\":\"US:NY\",\"woocommerce_custom_orders_table_enabled\":\"no\",\"woocommerce_feature_custom_order_tables_enabled\":\"no\",\"woocommerce_onboarding_profile\":{\"skipped\":true},\"woocommerce_task_list_hidden\":\"yes\"}},{\"step\":\"runPHP\",\"code\":\"<?php\\n\\\/**\\n * BrikPanel \\\"full demo\\\" seeder \\u2014 Playground\\\/SQLite safe + fast.\\n *\\n * Orders are written with direct $wpdb inserts (legacy CPT storage) instead of\\n * wc_create_order(), which is ~50x faster under PHP-wasm. RFM \\\/ LTV \\\/ cohort\\n * are computed in PHP and inserted directly, because BrikPanel's own recompute\\n * SQL uses MySQL-only TIMESTAMPDIFF()\\\/NTILE() that the SQLite layer rejects.\\n *\\\/\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\nif ( ! function_exists( 'wc_get_product' ) ) { return; }\\nif ( get_option( 'brikpanel_demo_seeded' ) ) { return; }\\n\\nglobal $wpdb;\\n$diag = array();\\n$t0 = microtime( true );\\n$now = time();\\n\\nif ( class_exists( 'WC_Install' ) ) { WC_Install::install(); }\\nupdate_option( 'woocommerce_feature_cost_of_goods_sold_enabled', 'yes' );\\nupdate_option( 'brikpanel_cogs_default_applied', 'yes' );\\nif ( function_exists( 'brikpanel_create_table' ) ) { brikpanel_create_table(); }\\n\\n\\\/* deterministic PRNG so the demo is identical every boot *\\\/\\n$seed = 987654321;\\n$rnd = function ( $min, $max ) use ( &$seed ) {\\n\\t$seed = ( $seed * 1103515245 + 12345 ) & 0x7fffffff;\\n\\treturn $min + ( $seed % ( $max - $min + 1 ) );\\n};\\n\\n\\\/* ---------------- 1) Products (price + COGS + category + stock) ---------- *\\\/\\n$catalog = array(\\n\\tarray( 'Aurora Desk Lamp', 49.00, 21.00, 120, 'Home & Office' ),\\n\\tarray( 'Nimbus Wireless Headphones', 129.00, 58.00, 80, 'Electronics' ),\\n\\tarray( 'Terra Ceramic Mug', 18.50, 6.50, 240, 'Kitchen' ),\\n\\tarray( 'Halo Smart Speaker', 89.00, 41.00, 0, 'Electronics' ),\\n\\tarray( 'Vega Cotton T-Shirt', 24.00, 8.00, 320, 'Apparel' ),\\n\\tarray( 'Orbit Travel Backpack', 75.00, 33.00, 45, 'Travel' ),\\n\\tarray( 'Lumen LED Strip', 32.00, 12.00, 9, 'Home & Office' ),\\n\\tarray( 'Pebble Bluetooth Tracker', 27.50, 9.50, 150, 'Electronics' ),\\n\\tarray( 'Cedar Cutting Board', 39.00, 15.00, 60, 'Kitchen' ),\\n\\tarray( 'Sol Sunglasses', 59.00, 19.00, 4, 'Apparel' ),\\n\\tarray( 'Drift Yoga Mat', 45.00, 17.00, 90, 'Fitness' ),\\n\\tarray( 'Forge Chef Knife', 68.00, 27.00, 33, 'Kitchen' ),\\n);\\n$cat_ids = array();\\n$products = array();\\nforeach ( $catalog as $row ) {\\n\\tlist( $name, $price, $cost, $stock, $cat ) = $row;\\n\\tif ( ! isset( $cat_ids[ $cat ] ) ) {\\n\\t\\t$term = term_exists( $cat, 'product_cat' );\\n\\t\\tif ( ! $term ) { $term = wp_insert_term( $cat, 'product_cat' ); }\\n\\t\\t$cat_ids[ $cat ] = is_wp_error( $term ) ? 0 : (int) $term['term_id'];\\n\\t}\\n\\t$p = new WC_Product_Simple();\\n\\t$p->set_name( $name );\\n\\t$p->set_regular_price( (string) $price );\\n\\t$p->set_price( (string) $price );\\n\\t$p->set_manage_stock( true );\\n\\t$p->set_stock_quantity( $stock );\\n\\t$p->set_stock_status( $stock > 0 ? 'instock' : 'outofstock' );\\n\\t$p->set_status( 'publish' );\\n\\tif ( $cat_ids[ $cat ] ) { $p->set_category_ids( array( $cat_ids[ $cat ] ) ); }\\n\\tif ( method_exists( $p, 'set_cogs_value' ) ) { $p->set_cogs_value( $cost ); }\\n\\t$pid = $p->save();\\n\\tupdate_post_meta( $pid, '_brikpanel_cogs', $cost );\\n\\t$products[] = array( 'id' => $pid, 'name' => $name, 'price' => $price, 'cost' => $cost );\\n}\\n$diag['products'] = count( $products );\\n\\n\\\/* ---------------- 2) Customers ---------- *\\\/\\n$people = array(\\n\\t'Olivia Bennett','Liam Carter','Emma Davies','Noah Evans','Ava Foster','James Green',\\n\\t'Sophia Hughes','Lucas Irwin','Mia Jensen','Ethan Knight','Isla Lewis','Mason Moore',\\n\\t'Amelia Novak','Henry Owen','Grace Patel','Leo Quinn','Chloe Reed','Max Turner',\\n);\\n$countries = array( 'US','GB','DE','CA','FR','AU','NL','SE' );\\n$cities    = array( 'US'=>'New York','GB'=>'London','DE'=>'Berlin','CA'=>'Toronto','FR'=>'Paris','AU'=>'Sydney','NL'=>'Amsterdam','SE'=>'Stockholm' );\\n$customers = array();\\nforeach ( $people as $i => $full ) {\\n\\t$parts = explode( ' ', $full );\\n\\t$email = strtolower( str_replace( ' ', '.', $full ) ) . '@example.com';\\n\\t$uid = email_exists( $email );\\n\\tif ( ! $uid ) {\\n\\t\\t$uid = wp_insert_user( array(\\n\\t\\t\\t'user_login' => 'cust_' . ( $i + 1 ), 'user_email' => $email,\\n\\t\\t\\t'first_name' => $parts[0], 'last_name' => isset( $parts[1] ) ? $parts[1] : '',\\n\\t\\t\\t'display_name' => $full, 'role' => 'customer', 'user_pass' => wp_generate_password( 16 ),\\n\\t\\t) );\\n\\t}\\n\\tif ( ! is_wp_error( $uid ) ) {\\n\\t\\t$c = $countries[ $i % count( $countries ) ];\\n\\t\\t$customers[] = array( 'id' => (int) $uid, 'email' => $email, 'country' => $c, 'city' => $cities[ $c ], 'first' => $parts[0], 'last' => isset($parts[1])?$parts[1]:'' );\\n\\t}\\n}\\n$diag['customers'] = count( $customers );\\n\\n\\\/* ---------------- 3) Orders via direct SQL ---------- *\\\/\\n$posts_tbl  = $wpdb->posts;\\n$meta_tbl   = $wpdb->postmeta;\\n$items_tbl  = $wpdb->prefix . 'woocommerce_order_items';\\n$itmeta_tbl = $wpdb->prefix . 'woocommerce_order_itemmeta';\\n$stats_tbl  = $wpdb->prefix . 'wc_order_stats';\\n\\n\\\/\\\/ VIP weighting for a realistic RFM spread.\\n$weights = array();\\nforeach ( $customers as $idx => $c ) {\\n\\t$w = ( $idx < 4 ) ? 6 : ( ( $idx < 9 ) ? 3 : 1 );\\n\\tfor ( $k = 0; $k < $w; $k++ ) { $weights[] = $idx; }\\n}\\n\\\/\\\/ Status mix: mostly paid, a few others for the donut.\\n$status_pool = array( 'wc-completed','wc-completed','wc-completed','wc-completed','wc-processing','wc-processing','wc-on-hold','wc-completed','wc-refunded','wc-cancelled','wc-failed' );\\n$counted_for_customer = array( 'wc-completed','wc-processing','wc-on-hold','wc-pending','wc-refunded' );\\n\\n\\\/\\\/ Day buckets => how many orders land in each (full today + 7d + 30d windows).\\n$plan = array();\\nfor ( $x = 0; $x < 6; $x++ )  { $plan[] = 0; }                 \\\/\\\/ today\\nfor ( $x = 0; $x < 18; $x++ ) { $plan[] = $rnd( 1, 6 ); }      \\\/\\\/ last 7 days\\nfor ( $x = 0; $x < 22; $x++ ) { $plan[] = $rnd( 7, 29 ); }     \\\/\\\/ last 30 days\\nfor ( $x = 0; $x < 24; $x++ ) { $plan[] = $rnd( 30, 89 ); }    \\\/\\\/ up to 90 days\\n\\n$cust_agg   = array(); \\\/\\\/ uid => [count,total,first_ts,last_ts, months=>set]\\n$orders_made = 0; $revenue = 0.0;\\n$suppress = $wpdb->suppress_errors( true );\\n\\nforeach ( $plan as $days_ago ) {\\n\\t$ts = $now - ( $days_ago * DAY_IN_SECONDS );\\n\\tif ( $days_ago === 0 ) { $ts -= $rnd( 600, 40000 ); } else { $ts -= $rnd( 0, 80000 ); }\\n\\t$gmt   = gmdate( 'Y-m-d H:i:s', $ts );\\n\\t$local = $gmt; \\\/\\\/ Playground store TZ is UTC.\\n\\t$cust  = $customers[ $weights[ $rnd( 0, count( $weights ) - 1 ) ] ];\\n\\t$status = $status_pool[ $rnd( 0, count( $status_pool ) - 1 ) ];\\n\\n\\t\\\/\\\/ Build line items.\\n\\t$lines = $rnd( 1, 3 );\\n\\t$used = array(); $items = array(); $order_total = 0.0; $order_cogs = 0.0; $num_items = 0;\\n\\tfor ( $j = 0; $j < $lines; $j++ ) {\\n\\t\\t$pr = $products[ $rnd( 0, count( $products ) - 1 ) ];\\n\\t\\tif ( isset( $used[ $pr['id'] ] ) ) { continue; }\\n\\t\\t$used[ $pr['id'] ] = 1;\\n\\t\\t$qty = $rnd( 1, 3 );\\n\\t\\t$line_total = round( $pr['price'] * $qty, 2 );\\n\\t\\t$items[] = array( 'pid' => $pr['id'], 'name' => $pr['name'], 'qty' => $qty, 'line_total' => $line_total );\\n\\t\\t$order_total += $line_total;\\n\\t\\t$order_cogs  += $pr['cost'] * $qty;\\n\\t\\t$num_items   += $qty;\\n\\t}\\n\\t$order_total = round( $order_total, 2 );\\n\\t$order_cogs  = round( $order_cogs, 2 );\\n\\n\\t\\\/\\\/ 3a) wp_posts\\n\\t$wpdb->insert( $posts_tbl, array(\\n\\t\\t'post_author' => 1, 'post_date' => $local, 'post_date_gmt' => $gmt,\\n\\t\\t'post_content' => '', 'post_title' => 'Order &ndash; ' . $gmt, 'post_excerpt' => '',\\n\\t\\t'post_status' => $status, 'comment_status' => 'closed', 'ping_status' => 'closed',\\n\\t\\t'post_password' => '', 'post_name' => 'order-' . $ts . '-' . $orders_made,\\n\\t\\t'to_ping' => '', 'pinged' => '', 'post_content_filtered' => '', 'post_parent' => 0,\\n\\t\\t'guid' => '', 'menu_order' => 0, 'post_type' => 'shop_order', 'post_mime_type' => '',\\n\\t\\t'comment_count' => 0, 'post_modified' => $local, 'post_modified_gmt' => $gmt,\\n\\t) );\\n\\t$oid = (int) $wpdb->insert_id;\\n\\tif ( ! $oid ) { continue; }\\n\\n\\t\\\/\\\/ 3b) postmeta\\n\\t$is_paid = in_array( $status, array( 'wc-completed','wc-processing' ), true );\\n\\t$metas = array(\\n\\t\\t'_order_currency' => 'USD', '_order_total' => number_format( $order_total, 2, '.', '' ),\\n\\t\\t'_order_tax' => '0', '_cart_discount' => '0', '_cart_discount_tax' => '0',\\n\\t\\t'_order_shipping' => '0', '_prices_include_tax' => 'no',\\n\\t\\t'_customer_user' => (string) $cust['id'], '_billing_email' => $cust['email'],\\n\\t\\t'_billing_first_name' => $cust['first'], '_billing_last_name' => $cust['last'],\\n\\t\\t'_billing_country' => $cust['country'], '_billing_city' => $cust['city'],\\n\\t\\t'_payment_method' => 'bacs', '_payment_method_title' => 'Direct bank transfer',\\n\\t\\t'_order_version' => '9.0.0', '_wc_cog_order_total_value' => number_format( $order_cogs, 2, '.', '' ),\\n\\t);\\n\\tif ( $is_paid ) { $metas['_date_paid'] = (string) $ts; $metas['_paid_date'] = $local; }\\n\\tforeach ( $metas as $mk => $mv ) {\\n\\t\\t$wpdb->insert( $meta_tbl, array( 'post_id' => $oid, 'meta_key' => $mk, 'meta_value' => $mv ) );\\n\\t}\\n\\n\\t\\\/\\\/ 3c) order items + itemmeta\\n\\tforeach ( $items as $it ) {\\n\\t\\t$wpdb->insert( $items_tbl, array( 'order_item_name' => $it['name'], 'order_item_type' => 'line_item', 'order_id' => $oid ) );\\n\\t\\t$item_id = (int) $wpdb->insert_id;\\n\\t\\tif ( ! $item_id ) { continue; }\\n\\t\\t$im = array(\\n\\t\\t\\t'_product_id' => (string) $it['pid'], '_variation_id' => '0', '_qty' => (string) $it['qty'],\\n\\t\\t\\t'_line_subtotal' => number_format( $it['line_total'], 2, '.', '' ), '_line_subtotal_tax' => '0',\\n\\t\\t\\t'_line_total' => number_format( $it['line_total'], 2, '.', '' ), '_line_tax' => '0', '_tax_class' => '',\\n\\t\\t);\\n\\t\\tforeach ( $im as $k => $v ) {\\n\\t\\t\\t$wpdb->insert( $itmeta_tbl, array( 'order_item_id' => $item_id, 'meta_key' => $k, 'meta_value' => $v ) );\\n\\t\\t}\\n\\t}\\n\\n\\t\\\/\\\/ 3d) wc_order_stats (powers new-vs-repeat split; best-effort)\\n\\t$returning = isset( $cust_agg[ $cust['id'] ] ) ? 1 : 0;\\n\\t$wpdb->insert( $stats_tbl, array(\\n\\t\\t'order_id' => $oid, 'parent_id' => 0, 'date_created' => $local, 'date_created_gmt' => $gmt,\\n\\t\\t'num_items_sold' => $num_items, 'total_sales' => $order_total, 'tax_total' => 0,\\n\\t\\t'shipping_total' => 0, 'net_total' => $order_total, 'returning_customer' => $returning,\\n\\t\\t'status' => $status, 'customer_id' => $cust['id'],\\n\\t) );\\n\\n\\t\\\/\\\/ 3e) customer aggregation (for RFM\\\/LTV\\\/cohort), counted statuses only\\n\\tif ( in_array( $status, $counted_for_customer, true ) ) {\\n\\t\\t$uid = $cust['id'];\\n\\t\\tif ( ! isset( $cust_agg[ $uid ] ) ) {\\n\\t\\t\\t$cust_agg[ $uid ] = array( 'count' => 0, 'total' => 0.0, 'first' => $ts, 'last' => $ts, 'email' => $cust['email'], 'months' => array() );\\n\\t\\t}\\n\\t\\t$cust_agg[ $uid ]['count']++;\\n\\t\\t$cust_agg[ $uid ]['total'] += $order_total;\\n\\t\\t$cust_agg[ $uid ]['first'] = min( $cust_agg[ $uid ]['first'], $ts );\\n\\t\\t$cust_agg[ $uid ]['last']  = max( $cust_agg[ $uid ]['last'], $ts );\\n\\t\\t$cust_agg[ $uid ]['months'][ gmdate( 'Y-m-01', $ts ) ] = 1;\\n\\t}\\n\\tif ( in_array( $status, array( 'wc-completed','wc-processing' ), true ) ) { $revenue += $order_total; }\\n\\t$orders_made++;\\n}\\n$wpdb->suppress_errors( $suppress );\\n$diag['orders'] = $orders_made;\\n$diag['revenue_paid'] = round( $revenue, 2 );\\n\\n\\\/* ---------------- 4) RFM + LTV \\u2192 customer_metrics ---------- *\\\/\\n$cm_tbl = $wpdb->prefix . 'brikpanel_customer_metrics';\\n$wpdb->query( \\\"DELETE FROM {$cm_tbl}\\\" );\\n\\n\\\/\\\/ NTILE(5)-style quintile helper. $pairs: key => value. $desc=true ranks\\n\\\/\\\/ largest value into tile 1 (used for recency where high=worst).\\n$ntile = function ( $pairs, $desc ) {\\n\\t$keys = array_keys( $pairs );\\n\\tusort( $keys, function ( $a, $b ) use ( $pairs, $desc ) {\\n\\t\\tif ( $pairs[ $a ] == $pairs[ $b ] ) { return 0; }\\n\\t\\t$cmp = ( $pairs[ $a ] < $pairs[ $b ] ) ? -1 : 1;\\n\\t\\treturn $desc ? -$cmp : $cmp;\\n\\t} );\\n\\t$n = count( $keys ); $out = array();\\n\\tif ( $n === 0 ) { return $out; }\\n\\t$base = intdiv( $n, 5 ); $rem = $n % 5; $pos = 0;\\n\\tfor ( $tile = 1; $tile <= 5; $tile++ ) {\\n\\t\\t$size = $base + ( $tile <= $rem ? 1 : 0 );\\n\\t\\tfor ( $s = 0; $s < $size; $s++ ) { $out[ $keys[ $pos++ ] ] = $tile; }\\n\\t}\\n\\treturn $out;\\n};\\n\\n$recency = array(); $freq = array(); $monet = array();\\nforeach ( $cust_agg as $uid => $a ) {\\n\\t$recency[ $uid ] = max( 0, intval( floor( ( $now - $a['last'] ) \\\/ DAY_IN_SECONDS ) ) );\\n\\t$freq[ $uid ]    = $a['count'];\\n\\t$monet[ $uid ]   = $a['total'];\\n}\\n$r_scores = $ntile( $recency, true );   \\\/\\\/ high recency -> tile 1\\n$f_scores = $ntile( $freq, false );     \\\/\\\/ high freq -> tile 5\\n$m_scores = $ntile( $monet, false );    \\\/\\\/ high spend -> tile 5\\n\\n$segment_of = function ( $r, $f, $m ) {\\n\\tif ( $r >= 4 && $f >= 4 && $m >= 4 ) { return 'champions'; }\\n\\tif ( $r <= 2 && $f >= 4 && $m >= 4 ) { return 'cant_lose'; }\\n\\tif ( $r <= 2 && $f >= 3 && $m >= 3 ) { return 'at_risk'; }\\n\\tif ( $r == 1 && $f == 1 && $m == 1 ) { return 'lost'; }\\n\\tif ( $r <= 2 && $f <= 2 ) { return 'hibernating'; }\\n\\tif ( $f >= 3 && $m >= 3 ) { return 'loyal'; }\\n\\tif ( $r >= 4 && $f == 1 ) { return 'new'; }\\n\\tif ( $r >= 4 && $f <= 3 ) { return 'potential_loyalist'; }\\n\\tif ( $r == 3 && $f <= 2 ) { return 'about_to_sleep'; }\\n\\tif ( $f >= 3 ) { return 'need_attention'; }\\n\\treturn 'hibernating';\\n};\\n\\n$cm_rows = 0; $nowgmt = gmdate( 'Y-m-d H:i:s', $now );\\nforeach ( $cust_agg as $uid => $a ) {\\n\\t$r = isset( $r_scores[ $uid ] ) ? $r_scores[ $uid ] : 0;\\n\\t$f = isset( $f_scores[ $uid ] ) ? $f_scores[ $uid ] : 0;\\n\\t$m = isset( $m_scores[ $uid ] ) ? $m_scores[ $uid ] : 0;\\n\\t$wpdb->insert( $cm_tbl, array(\\n\\t\\t'customer_key' => 'u:' . $uid, 'user_id' => $uid, 'customer_email' => $a['email'],\\n\\t\\t'first_order_date' => gmdate( 'Y-m-d H:i:s', $a['first'] ), 'last_order_date' => gmdate( 'Y-m-d H:i:s', $a['last'] ),\\n\\t\\t'order_count' => $a['count'], 'total_spent' => round( $a['total'], 4 ),\\n\\t\\t'aov' => round( $a['count'] ? $a['total'] \\\/ $a['count'] : 0, 4 ), 'recency_days' => $recency[ $uid ],\\n\\t\\t'r_score' => $r, 'f_score' => $f, 'm_score' => $m, 'rfm_segment' => $segment_of( $r, $f, $m ),\\n\\t\\t'computed_at' => $nowgmt,\\n\\t) );\\n\\t$cm_rows++;\\n}\\n$diag['cm_rows'] = $cm_rows;\\n\\n\\\/* ---------------- 5) Cohort retention ---------- *\\\/\\n$coh_tbl = $wpdb->prefix . 'brikpanel_cohort_retention';\\n$wpdb->query( \\\"DELETE FROM {$coh_tbl}\\\" );\\n$cohorts = array(); \\\/\\\/ cohort_month => [ uid => months_set ]\\nforeach ( $cust_agg as $uid => $a ) {\\n\\t$first_month = gmdate( 'Y-m-01', $a['first'] );\\n\\t$cohorts[ $first_month ][ $uid ] = $a['months'];\\n}\\n$cur_month = gmdate( 'Y-m-01', $now );\\n$coh_rows = 0;\\nforeach ( $cohorts as $cmonth => $members ) {\\n\\t$size = count( $members );\\n\\tfor ( $off = 0; $off <= 6; $off++ ) {\\n\\t\\t$target = gmdate( 'Y-m-01', strtotime( \\\"{$cmonth} +{$off} month\\\" ) );\\n\\t\\tif ( strtotime( $target ) > strtotime( $cur_month ) ) { break; }\\n\\t\\t$retained = 0;\\n\\t\\tforeach ( $members as $uid => $monthsSet ) {\\n\\t\\t\\tif ( isset( $monthsSet[ $target ] ) ) { $retained++; }\\n\\t\\t}\\n\\t\\t$rate = $size > 0 ? round( $retained \\\/ $size * 100, 2 ) : 0;\\n\\t\\t$wpdb->insert( $coh_tbl, array(\\n\\t\\t\\t'cohort_month' => $cmonth, 'period_offset' => $off, 'cohort_size' => $size,\\n\\t\\t\\t'retained_customers' => $retained, 'retention_rate' => $rate, 'computed_at' => $nowgmt,\\n\\t\\t) );\\n\\t\\t$coh_rows++;\\n\\t}\\n}\\n$diag['cohort_rows'] = $coh_rows;\\n\\n\\\/* ---------------- 6) Ad spend (USD), expenses, visitors ---------- *\\\/\\n$ad_tbl = $wpdb->prefix . 'brikpanel_ad_spend'; $ad_rows = 0; $ad_total = 0.0;\\nfor ( $d = 0; $d < 90; $d++ ) {\\n\\t$date = gmdate( 'Y-m-d', $now - $d * DAY_IN_SECONDS );\\n\\tforeach ( array( 'google_ads' => 1.0, 'meta' => 0.7 ) as $plat => $mult ) {\\n\\t\\t$spend = round( $rnd( 18, 60 ) * $mult, 2 );\\n\\t\\t$wpdb->insert( $ad_tbl, array(\\n\\t\\t\\t'date' => $date, 'platform' => $plat, 'account_id' => ( $plat === 'google_ads' ? '528-898-0937' : 'act_demo' ),\\n\\t\\t\\t'spend_amount' => $spend, 'spend_currency' => 'USD', 'impressions' => $rnd( 800, 5000 ), 'clicks' => $rnd( 20, 180 ),\\n\\t\\t) );\\n\\t\\t$ad_rows++; $ad_total += $spend;\\n\\t}\\n}\\n$diag['ad_spend_rows'] = $ad_rows; $diag['ad_spend_total'] = round( $ad_total, 2 );\\n\\n$exp_tbl = $wpdb->prefix . 'brikpanel_expenses'; $exp_rows = 0;\\n$exp_items = array( array('Rent','Warehouse rent',1200,'monthly'), array('Software','SaaS subscriptions',240,'monthly'), array('Salaries','Part-time staff',1800,'monthly') );\\nfor ( $mo = 0; $mo < 3; $mo++ ) {\\n\\t$mdate = gmdate( 'Y-m-01', strtotime( \\\"-{$mo} month\\\", $now ) );\\n\\tforeach ( $exp_items as $e ) {\\n\\t\\t$wpdb->insert( $exp_tbl, array( 'expense_date' => $mdate, 'category' => $e[0], 'description' => $e[1], 'amount' => $e[2], 'recurring' => $e[3] ) );\\n\\t\\t$exp_rows++;\\n\\t}\\n}\\n$diag['expense_rows'] = $exp_rows;\\n\\n\\\/\\\/ Daily paid-order counts for realistic conversion.\\n$daily_orders = array();\\nforeach ( $cust_agg as $a ) { \\\/* placeholder *\\\/ }\\n\\\/\\\/ Recount paid orders per day directly from posts.\\n$rowsd = $wpdb->get_results( \\\"SELECT substr(post_date,1,10) d, COUNT(*) c FROM {$posts_tbl} WHERE post_type='shop_order' AND post_status IN ('wc-completed','wc-processing') GROUP BY d\\\", ARRAY_A );\\nforeach ( (array) $rowsd as $r ) { $daily_orders[ $r['d'] ] = (int) $r['c']; }\\n\\n$vis_tbl = $wpdb->prefix . 'brikpanel_visitors'; $vis_rows = 0; $vis_sum = 0;\\nfor ( $d = 0; $d < 90; $d++ ) {\\n\\t$date = gmdate( 'Y-m-d', $now - $d * DAY_IN_SECONDS );\\n\\t$ord_today = isset( $daily_orders[ $date ] ) ? $daily_orders[ $date ] : 0;\\n\\t$visitors = max( 40, $ord_today * $rnd( 25, 40 ) + $rnd( 30, 120 ) );\\n\\t$add_cart = (int) round( $visitors * ( $rnd( 25, 40 ) \\\/ 100 ) );\\n\\t$checkout = max( $ord_today, (int) round( $add_cart * ( $rnd( 35, 60 ) \\\/ 100 ) ) );\\n\\t$mobile = (int) round( $visitors * 0.55 ); $tablet = (int) round( $visitors * 0.10 ); $desktop = $visitors - $mobile - $tablet;\\n\\t$wpdb->insert( $vis_tbl, array(\\n\\t\\t'date_column' => $date, 'visitor_count' => $visitors, 'product_count' => $rnd( 5, 12 ),\\n\\t\\t'add_to_cart_count' => $add_cart, 'checkout_count' => $checkout,\\n\\t\\t'mobile_count' => $mobile, 'tablet_count' => $tablet, 'desktop_count' => $desktop,\\n\\t) );\\n\\t$vis_rows++; $vis_sum += $visitors;\\n}\\n$diag['visitor_rows'] = $vis_rows; $diag['visitor_sum'] = $vis_sum;\\n\\nupdate_option( 'brikpanel_demo_seeded', 1, false );\\n\"},{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"}]}"}},"all_blocks":[],"tagged_versions":["1.1.5","1.1.6","1.1.7","1.1.8","1.1.9","1.2.0","1.2.1","1.2.2","1.2.3","1.2.4","1.2.5","1.2.6","1.2.7","1.2.8","1.2.9","1.3.0","1.3.1","1.3.2","1.3.3","1.4.2","1.4.3","1.4.5","1.4.6","1.5.1","2.0.0","2.0.1","2.0.2","2.0.3","2.0.4","2.0.5","2.0.6","2.0.7","2.1.0","2.1.1","2.1.2","2.1.3","2.1.4","2.1.5","2.1.6","2.1.7","2.1.8","2.5.0","2.5.2","2.5.3","2.6.0","2.6.1","2.7.0","2.7.1","2.8.0","2.8.1","2.8.2","2.8.3","2.8.4","2.8.5","2.8.6","2.9.2","2.9.3","2.9.4","3.0.0","3.0.1","3.0.2","3.0.3","3.0.4","3.0.5","3.0.6","3.0.7","3.0.8","3.0.9","3.1.0","3.1.1","3.1.10","3.1.11","3.1.12","3.1.13","3.1.14","3.1.15","3.1.16","3.1.17","3.1.19","3.1.2","3.1.21","3.1.23","3.1.24","3.1.25","3.1.28","3.1.29","3.1.3","3.1.30","3.1.31","3.1.32","3.1.33","3.1.34","3.1.35","3.1.36","3.1.37","3.1.38","3.1.39","3.1.4","3.1.40","3.1.41","3.1.42","3.1.43","3.1.44","3.1.45","3.1.46","3.1.47","3.1.5","3.1.51","3.1.6","3.1.8","3.1.9","3.2.0","3.2.1","3.2.10","3.2.11","3.2.12","3.2.15","3.2.16","3.2.17","3.2.19","3.2.20","3.2.21","3.2.22","3.2.23","3.2.27","3.2.28","3.2.29","3.2.3","3.2.30","3.2.33","3.2.34","3.2.35","3.2.36","3.2.4","3.2.42","3.2.43","3.2.44","3.2.5","3.2.6","3.2.60","3.2.63","3.2.68","3.2.69","3.2.7","3.2.70","3.2.71","3.2.72","3.2.73","3.2.75","3.2.76","3.2.77","3.2.78","3.2.8","3.2.80","3.2.84","3.2.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3534620,"resolution":"1","location":"assets","locale":"","width":1320,"height":1480},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3597574,"resolution":"10","location":"assets","locale":"","width":1320,"height":740},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3597574,"resolution":"11","location":"assets","locale":"","width":1320,"height":980},"screenshot-12.png":{"filename":"screenshot-12.png","revision":3597574,"resolution":"12","location":"assets","locale":"","width":1320,"height":920},"screenshot-13.png":{"filename":"screenshot-13.png","revision":3597574,"resolution":"13","location":"assets","locale":"","width":1320,"height":1040},"screenshot-14.png":{"filename":"screenshot-14.png","revision":3597574,"resolution":"14","location":"assets","locale":"","width":1320,"height":1040},"screenshot-15.png":{"filename":"screenshot-15.png","revision":3597574,"resolution":"15","location":"assets","locale":"","width":1320,"height":1080},"screenshot-16.png":{"filename":"screenshot-16.png","revision":3597574,"resolution":"16","location":"assets","locale":"","width":1320,"height":1080},"screenshot-17.png":{"filename":"screenshot-17.png","revision":3597574,"resolution":"17","location":"assets","locale":"","width":1320,"height":1080},"screenshot-18.png":{"filename":"screenshot-18.png","revision":3597574,"resolution":"18","location":"assets","locale":"","width":1919,"height":1079},"screenshot-19.png":{"filename":"screenshot-19.png","revision":3597574,"resolution":"19","location":"assets","locale":"","width":1320,"height":760},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3597586,"resolution":"2","location":"assets","locale":"","width":1900,"height":1078},"screenshot-20.png":{"filename":"screenshot-20.png","revision":3597574,"resolution":"20","location":"assets","locale":"","width":1320,"height":760},"screenshot-21.png":{"filename":"screenshot-21.png","revision":3597574,"resolution":"21","location":"assets","locale":"","width":1280,"height":860},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3597574,"resolution":"3","location":"assets","locale":"","width":1320,"height":600},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3597574,"resolution":"4","location":"assets","locale":"","width":1320,"height":880},"screenshot-5.gif":{"filename":"screenshot-5.gif","revision":3597574,"resolution":"5","location":"assets","locale":"","width":1920,"height":1080},"screenshot-6.gif":{"filename":"screenshot-6.gif","revision":3597574,"resolution":"6","location":"assets","locale":"","width":1920,"height":1080},"screenshot-7.gif":{"filename":"screenshot-7.gif","revision":3597574,"resolution":"7","location":"assets","locale":"","width":1920,"height":1080},"screenshot-8.gif":{"filename":"screenshot-8.gif","revision":3597574,"resolution":"8","location":"assets","locale":"","width":1920,"height":1080},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3597574,"resolution":"9","location":"assets","locale":"","width":1320,"height":1180}},"screenshots":{"1":"Dashboard","2":"Cart Recovery","3":"Ads ROAS","4":"Sheets Sync","5":"Product List","6":"Quick Edit","7":"Bulk Edit","8":"Product Editor","9":"Customer LTV","10":"RFM Segments","11":"Cohort Retention","12":"Geo Analytics","13":"Live Visitors","14":"Order Search","15":"Orders Explorer","16":"Customers Explorer","17":"Order Management","18":"Categories","19":"Coupons","20":"Add Coupon","21":"Login Page"}},"plugin_section":[],"plugin_tags":[25296,257359,230338,76265,156984],"plugin_category":[],"plugin_contributors":[232895],"plugin_business_model":[],"class_list":["post-226093","plugin","type-plugin","status-publish","hentry","plugin_tags-google-sheets","plugin_tags-roas","plugin_tags-woocommerce-bulk-editor","plugin_tags-woocommerce-dashboard","plugin_tags-woocommerce-inventory-management","plugin_contributors-brksoft","plugin_committers-brksoft","plugin_support_reps-niyht"],"banners":{"banner":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/banner-772x250.png?rev=3534620","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/icon-128x128.gif?rev=3501915","icon_2x":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/icon-256x256.gif?rev=3501915","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-1.png?rev=3534620","caption":"Dashboard"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-2.png?rev=3597586","caption":"Cart Recovery"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-3.png?rev=3597574","caption":"Ads ROAS"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-4.png?rev=3597574","caption":"Sheets Sync"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-5.gif?rev=3597574","caption":"Product List"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-6.gif?rev=3597574","caption":"Quick Edit"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-7.gif?rev=3597574","caption":"Bulk Edit"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-8.gif?rev=3597574","caption":"Product Editor"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-9.png?rev=3597574","caption":"Customer LTV"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-10.png?rev=3597574","caption":"RFM Segments"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-11.png?rev=3597574","caption":"Cohort Retention"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-12.png?rev=3597574","caption":"Geo Analytics"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-13.png?rev=3597574","caption":"Live Visitors"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-14.png?rev=3597574","caption":"Order Search"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-15.png?rev=3597574","caption":"Orders Explorer"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-16.png?rev=3597574","caption":"Customers Explorer"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-17.png?rev=3597574","caption":"Order Management"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-18.png?rev=3597574","caption":"Categories"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-19.png?rev=3597574","caption":"Coupons"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-20.png?rev=3597574","caption":"Add Coupon"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-21.png?rev=3597574","caption":"Login Page"}],"raw_content":"<!--section=description-->\n<p><strong>Live demo (no install needed):<\/strong> <a href=\"https:\/\/code.brksoft.com\/wp-admin\/\">Explore the full BrikPanel admin on a real WooCommerce store<\/a><\/p>\n\n<p>https:\/\/www.youtube.com\/watch?v=pmtmVQifZME&amp;t<\/p>\n\n<p><strong>BrikPanel turns the default WooCommerce admin panel into a clean, fast, all-in-one cockpit<\/strong>: a modern WooCommerce dashboard, a real-time WooCommerce sales report, a powerful WooCommerce bulk editor, an inventory management workspace, an order management center, a coupon manager, a custom WP login page, and a real-time conversion tracking suite. Everything is free. Forever. No premium tier, no feature locks, no monthly subscriptions. A self-hosted <strong>Shopify alternative for WooCommerce<\/strong>: own your data, your products, and your customer list, with no monthly platform fee and no transaction fee.<\/p>\n\n<h4>Who is BrikPanel for?<\/h4>\n\n<ul>\n<li>Store owners who want a <strong>modern WooCommerce dashboard<\/strong> with real numbers, not the slow built-in reports, and a <strong>self-hosted WooCommerce analytics<\/strong> solution instead of paying monthly fees to external SaaS tools<\/li>\n<li>Stores that want a lighter <strong>woocommerce inventory management<\/strong> workspace built into a complete admin redesign<\/li>\n<li>Anyone who needs to <strong>bulk edit WooCommerce products<\/strong>, including variations, without a premium plugin<\/li>\n<li>Agencies handing off stores to non-technical clients who need a <strong>simplified WooCommerce admin<\/strong><\/li>\n<li>Shop owners migrating from Shopify who want a familiar, modern admin for their WooCommerce store, a free, self-hosted <strong>Shopify alternative<\/strong><\/li>\n<\/ul>\n\n<h3>What you get (all free)<\/h3>\n\n<h4>Modern WooCommerce Dashboard &amp; Sales Report with Real-Time Analytics<\/h4>\n\n<p>The heart of BrikPanel is a <strong>modern WooCommerce dashboard<\/strong>, a true <strong>woocommerce admin panel plugin<\/strong>, not a styling layer.<\/p>\n\n<ul>\n<li><strong>Total Sales, Total Orders, Average Order Value (AOV)<\/strong>: today, yesterday, last 7\/30 days, or any custom range, with <strong>\u00b1% period-over-period delta<\/strong> on every metric<\/li>\n<li><strong>Visitors<\/strong> counted from your own database (admins excluded), and <strong>Conversion Rate<\/strong> computed live from real visitors and real orders<\/li>\n<li><strong>Beautiful sales chart<\/strong> powered by Chart.js, plus an <strong>order status donut<\/strong> (Completed, Processing, Cancelled, Refunded, Failed)<\/li>\n<li><strong>WooCommerce conversion funnel<\/strong>: Visitors \u2192 Add to Cart \u2192 Checkout \u2192 Orders, with the conversion percentage at every step<\/li>\n<\/ul>\n\n<p>This is a complete <strong>WooCommerce sales report<\/strong> and <strong>reporting<\/strong> layer: real-time <strong>sales reports<\/strong>, charts and KPIs inside a <strong>modern WooCommerce admin<\/strong>, with no external analytics service.<\/p>\n\n<h4>Customer Analytics: LTV, RFM Segmentation &amp; Cohort Retention<\/h4>\n\n<p>BrikPanel ships a complete <strong>WooCommerce customer analytics<\/strong> suite, calculated from your store data and visualized in the dashboard, no external service.<\/p>\n\n<ul>\n<li><strong>Customer Lifetime Value (LTV)<\/strong>: total customers, average and top LTV, full LTV distribution histogram, and a sortable top-customers table<\/li>\n<li><strong>RFM segmentation<\/strong>: every customer scored on Recency, Frequency, and Monetary, then bucketed into Champions, Loyal, At Risk, About to Sleep, Hibernating, and Lost, with revenue per segment<\/li>\n<li><strong>Cohort retention<\/strong>: month-by-month cohort retention grid plus an average retention by month-offset trend line<\/li>\n<li><strong>Advanced filtering and segmentation<\/strong>: combine spend range, product, location, date and more to build saved segments for both customers and orders<\/li>\n<\/ul>\n\n<h4>Live Visitors &amp; Real-Time Conversion Tracking<\/h4>\n\n<p>BrikPanel ships a built-in <strong>WooCommerce live visitors<\/strong> widget, see who is on your store right now, what page they are on, and whether they have items in the cart. Refreshes every 30 seconds by default (configurable). No external service, no Hotjar, no monthly fee.<\/p>\n\n<ul>\n<li><strong>WooCommerce real time visitors<\/strong> widget with cart status (<em>Browsing \/ Has items in cart \/ On thank-you page<\/em>), current page, and customer info<\/li>\n<li><strong>WooCommerce conversion tracking<\/strong> in the same database that powers the dashboard<\/li>\n<li>Visitor IPs are never stored, only a salted SHA-256 hash, and live visitor data stays in a short-lived cache, never in the database<\/li>\n<li>Privacy switches: make tracking wait for cookie consent (WordPress Consent API or your own banner), turn front-end tracking off entirely, or keep it on while excluding logged-in customer details from the Live view<\/li>\n<li>Most-viewed pages and most added-to-cart products reports<\/li>\n<\/ul>\n\n<p>A free <strong>woocommerce statistics plugin<\/strong> and <strong>woocommerce sales tracker<\/strong> without any external SaaS.<\/p>\n\n<h4>Geographic Analytics: WooCommerce Sales by Country<\/h4>\n\n<p>A 3D rotating globe (Cobe.js) plots every order on its real location, see <strong>WooCommerce sales by country<\/strong> and city without exporting a CSV, with <strong>Top 10 Countries<\/strong> and <strong>Top 10 Cities<\/strong> tables. Works with both HPOS and legacy order storage.<\/p>\n\n<h4>Lightning-Fast Order Search: Cmd\/Ctrl + K from Anywhere<\/h4>\n\n<p>Hit <code>Ctrl + K<\/code> (or <code>Cmd + K<\/code> on Mac) anywhere in wp-admin and an order search overlay opens, the free <strong>woocommerce order search plugin<\/strong>. Searches order ID, customer name, email, phone and product SKU inside line items at once. True <strong>woocommerce quick search<\/strong>, with results as you type, status badges, totals and dates.<\/p>\n\n<h4>Modern WooCommerce Order Management<\/h4>\n\n<p>BrikPanel replaces the cluttered default orders page with a clean <strong>woocommerce order list plugin<\/strong> screen.<\/p>\n\n<ul>\n<li><strong>30-day overview bar<\/strong>: total orders, completed, refunded, cancelled, revenue<\/li>\n<li><strong>Inline status change<\/strong> without opening the edit page<\/li>\n<li>HPOS (<code>wc_get_orders<\/code>) and legacy storage (<code>WP_Query<\/code>) both supported<\/li>\n<li>Two new statuses: <strong>Return Draft<\/strong> and <strong>Change<\/strong><\/li>\n<li>Reskinned order edit page with copy-to-clipboard for billing\/shipping<\/li>\n<li><strong>Sold downloadable products column<\/strong> on the order edit page<\/li>\n<li>Optional BrikMarket marketplace stats integration<\/li>\n<\/ul>\n\n<p>A real <strong>woocommerce order management plugin<\/strong>, not a reskin. Disable from settings anytime.<\/p>\n\n<h4>WooCommerce Product List Plugin: Built for People Who Actually Edit Products<\/h4>\n\n<p>The default <strong>WooCommerce product list<\/strong> is fine for browsing, painful for editing. BrikPanel ships a complete <strong>woocommerce product list plugin<\/strong> that fixes it.<\/p>\n\n<ul>\n<li>Thumbnail, name, SKU, regular\/sale price, stock badge, category<\/li>\n<li><strong>Publish status toggle<\/strong>: flip draft \u2194 published with one click, no reload<\/li>\n<li>Edit, Duplicate, Delete actions; bulk publish, draft, delete<\/li>\n<li>Status tabs (All \/ Published \/ Draft \/ Trash), live search by name or SKU<\/li>\n<li>Configurable per-page (5\u2013100, default 20), AJAX pagination<\/li>\n<li><strong>Per-user toggles for any third-party \/ SEO column<\/strong> added by Yoast, Rank Math, ASE and other plugins<\/li>\n<li><strong>Admin and Site Enhancements (ASE) custom columns<\/strong> are respected in the BrikPanel product, order and customer lists<\/li>\n<\/ul>\n\n<h4>Quick Edit Sidebar: Edit Without Leaving the List<\/h4>\n\n<p>A slide-in panel from any product row to edit name, SKU, regular\/sale price, stock and category, saved without leaving the list. The <strong>woocommerce quick edit<\/strong> WooCommerce should have shipped years ago: update <strong>woocommerce quick edit price<\/strong>, stock or category in two clicks.<\/p>\n\n<h4>Bulk Edit WooCommerce Products with the Variation Editor: Full Variation Support<\/h4>\n\n<p>This is where BrikPanel pulls ahead of every other free <strong>woocommerce bulk editor<\/strong>. Most free plugins only handle simple products and only \"increase price by X%\". BrikPanel does far more, on variable products too.<\/p>\n\n<ul>\n<li><strong>WooCommerce bulk price update<\/strong> (regular and sale): percentage, fixed amount, or absolute value, across the whole catalog or filtered by category<\/li>\n<li><strong>Bulk update WooCommerce products<\/strong> stock quantities (in\/out of stock, set quantity, add\/subtract)<\/li>\n<li><strong>WooCommerce bulk price by category<\/strong>: pick a category, set a rule, every product updates<\/li>\n<li><strong>WooCommerce bulk sale price<\/strong> updates with a date range<\/li>\n<li>Confirmation dialog on every bulk action<\/li>\n<\/ul>\n\n<p>Now the part nobody else does for free: <strong>variation support<\/strong>.<\/p>\n\n<ul>\n<li><strong>WooCommerce variation editor<\/strong>: open any variable product and edit every variation in one modal (regular price, sale price, stock, SKU)<\/li>\n<li><strong>Bulk edit variation prices WooCommerce<\/strong>: set the same price for all variations of an attribute (every \"Red\" variation, every \"L\" size), or apply a percentage rule<\/li>\n<li><strong>Bulk update variation stock<\/strong>: set or adjust the stock of every variation in one click<\/li>\n<li>Attribute filter to narrow visible variations when a product has 50+ combinations<\/li>\n<\/ul>\n\n<p><strong>How to bulk edit WooCommerce products<\/strong> including variations without buying a $79\/year plugin? BrikPanel handles both simple and variable products for free.<\/p>\n\n<h4>Simplified WooCommerce Product Editor<\/h4>\n\n<p>The default WooCommerce add-product screen has 11 metaboxes, 3 tabs and 40+ fields. BrikPanel ships a complete <strong>woocommerce product editor plugin<\/strong> with the noise removed.<\/p>\n\n<ul>\n<li><strong>Featured image + product gallery<\/strong> with drag-and-drop upload, unlimited images, drag-to-reorder<\/li>\n<li>Regular price, sale price with decimal validation<\/li>\n<li><strong>Searchable category picker<\/strong> with multi-select + <strong>quick create category<\/strong> without leaving the page<\/li>\n<li><strong>Brand field<\/strong>: the WooCommerce <code>product_brand<\/code> taxonomy is now first-class alongside categories and tags<\/li>\n<li>Short description + full rich-text description (wp_editor)<\/li>\n<li><strong>SEO fields<\/strong>: custom slug, meta title, meta description, live Google SERP preview<\/li>\n<li><strong>Full SEO plugin compatibility<\/strong>: Yoast SEO, Rank Math, All in One SEO and SEOPress metaboxes (including the SEO score panel) render and save inside the BrikPanel product editor<\/li>\n<li>Product type (Simple, Variable), <strong>attribute management<\/strong> with inline create<\/li>\n<li><strong>Auto-generate variations<\/strong> from attribute combinations, per-variation price\/sale\/SKU\/stock<\/li>\n<li>Duplicate any product in one click<\/li>\n<\/ul>\n\n<p>Opt-in. Keep the default WooCommerce product page if you prefer.<\/p>\n\n<h4>WooCommerce Variation Gallery<\/h4>\n\n<p>Attach a separate image gallery to each product variation, the frontend swaps gallery automatically when a customer picks a variation. Image metadata (srcset, sizes, alt text) is fully preserved.<\/p>\n\n<h4>WooCommerce Categories Page: Drag-and-Drop Parent\/Child Management<\/h4>\n\n<p>BrikPanel rebuilds the dated WooCommerce category screen with per-page settings (5\u2013200) and <strong>drag-and-drop parent\/child nesting<\/strong> with circular reference prevention, for both <code>product_cat<\/code> and <code>product_tag<\/code>.<\/p>\n\n<h4>Best WooCommerce Coupon Plugin: Free Coupon Manager<\/h4>\n\n<p>A complete <strong>WooCommerce coupon manager<\/strong> that makes coupons first-class in the admin, and we think the <strong>best WooCommerce coupon plugin<\/strong> in the free repository.<\/p>\n\n<ul>\n<li>Coupon table with code copy-to-clipboard, discount type icon, amount, usage count, expiry highlighting, and status<\/li>\n<li>Status tabs, AJAX pagination, <strong>slide-over coupon panel<\/strong>: create\/edit without a reload<\/li>\n<li>Auto-generate random coupon codes; one-click duplicate<\/li>\n<li>Discount types: percentage, fixed cart, fixed product + free shipping toggle<\/li>\n<li>Expiry date picker, total + per-customer usage limits, min\/max spend, individual use toggle, product\/category include\/exclude rules<\/li>\n<\/ul>\n\n<h4>WooCommerce Cart Abandonment &amp; Cart Recovery<\/h4>\n\n<p>A built-in <strong>WooCommerce cart abandonment<\/strong> and <strong>cart recovery<\/strong> system, with no external email SaaS. A dedicated <strong>Abandoned Carts<\/strong> screen captures the checkout email of shoppers who do not finish (classic and block checkout, plus logged-in add-to-cart) and snapshots each cart down to the exact variation. Carts move Active to Abandoned to Recovered automatically, and an optional popup hands each subscriber a single-use <strong>cart recovery coupon<\/strong>. Search and date filters, plus CSV \/ Excel export.<\/p>\n\n<h4>Custom WordPress Login Page: Custom WP Login Page for WooCommerce<\/h4>\n\n<p>A <strong>custom WP login page<\/strong> that fully replaces the default <code>wp-login.php<\/code> look, a real <strong>WordPress login customizer<\/strong> for WooCommerce stores.<\/p>\n\n<ul>\n<li>Centered card layout with your site name as logo<\/li>\n<li>Minimal, distraction-free fields, AJAX submission (no reload)<\/li>\n<li>Toast notification on errors, footer site branding<\/li>\n<li>Default WordPress login styles fully hidden<\/li>\n<\/ul>\n\n<h4>WooCommerce Inventory Management<\/h4>\n\n<p>A complete <strong>woocommerce inventory management<\/strong> workspace: the product list, bulk editor, variation editor and quick edit sidebar work together as one inventory workflow.<\/p>\n\n<ul>\n<li>Current stock for every product and variation in one place, with stock badges in the product list (in stock \/ low stock \/ out of stock)<\/li>\n<li>Update stock inline from the quick edit sidebar, or bulk update across categories and variations<\/li>\n<li>HPOS-enabled stores supported<\/li>\n<\/ul>\n\n<p>A free <strong>woocommerce inventory management plugin<\/strong> that covers the daily workflow, no heavy stock control plugin needed.<\/p>\n\n<h4>Custom Top Admin Bar &amp; Notifications<\/h4>\n\n<p>A <strong>Custom BrikPanel-styled top admin bar<\/strong> replaces the default WordPress toolbar with an e-commerce notification bell and quick links, toggleable from settings. Sound, confetti and a popup the moment a completed order arrives.<\/p>\n\n<h4>Google Sheets Sync: Real-Time WooCommerce Google Sheets Integration<\/h4>\n\n<p>BrikPanel ships a free <strong>WooCommerce Google Sheets sync<\/strong>, a fully native <strong>WooCommerce to Google Sheets<\/strong> integration that streams orders, customers and analytics into a Google Sheet you control. The free <strong>GSheetConnector alternative<\/strong> with no Zapier, no Make, no monthly fee.<\/p>\n\n<ul>\n<li><strong>Real-time order sync<\/strong>: every new WooCommerce order is appended within seconds, one row per line item so variations get their own columns. Free <strong>woocommerce order sync to google sheets<\/strong> with no external automation tool<\/li>\n<li><strong>Scheduled WooCommerce Google Sheets export<\/strong>: hourly, every 4h or daily catch-up; idempotent so re-runs never duplicate rows<\/li>\n<li><strong>Analytics report snapshots<\/strong>: Sales Summary, Daily KPIs, Top Products and Funnel tabs refreshed on an interval for pivots and dashboards in Sheets<\/li>\n<li><strong>Customer + RFM snapshot<\/strong>: chained to the nightly RFM recompute<\/li>\n<\/ul>\n\n<p>HPOS-compatible: a real <strong>google sheets woocommerce sync<\/strong>, free.<\/p>\n\n<h4>WooCommerce ROAS, Net Profit &amp; Ad Spend: Google Ads + Meta Ads<\/h4>\n\n<p>BrikPanel pulls daily spend from <strong>Google Ads<\/strong> and <strong>Meta Ads<\/strong> (Facebook \/ Instagram) so you see real <strong>WooCommerce ROAS<\/strong>, <strong>Net Profit<\/strong> and <strong>ad spend<\/strong> next to revenue. Multi-currency aware. A free <strong>Triple Whale alternative<\/strong> and <strong>woocommerce profit tracking<\/strong> dashboard with no monthly fee.<\/p>\n\n<h4>BrikMarket Marketplace Analytics<\/h4>\n\n<p>When BrikMarket is active, marketplace orders are excluded from the storefront conversion rate, and a dashboard block breaks down orders, share and top categories per marketplace.<\/p>\n\n<h4>Subscription &amp; Membership Plugin Compatibility<\/h4>\n\n<p>Subscription products and member orders (WooCommerce Subscriptions, MemberPress, Paid Memberships Pro and more) show up in the same product list, order screens and customer analytics.<\/p>\n\n<h4>Developer Hooks &amp; Filters<\/h4>\n\n<p>A <strong>developer hooks and filters system<\/strong> for agencies, actions and filters like <code>brikpanel_after_product_save<\/code>, plus a built-in docs popup in settings with one-click copy buttons.<\/p>\n\n<h4>Navigation &amp; Admin UI Cleanup<\/h4>\n\n<ul>\n<li>BrikPanel dashboard becomes the first WordPress admin menu item; admin bar gains quick links, footer rebranded<\/li>\n<li>Optional <strong>simplified mode<\/strong> hides the full WordPress menu, showing only BrikPanel + WooCommerce for non-technical clients<\/li>\n<\/ul>\n\n<h3>A Free, Self-Hosted WooCommerce Analytics &amp; Inventory Suite<\/h3>\n\n<p>Store owners pay monthly SaaS fees for parts of what BrikPanel does free:<\/p>\n\n<ul>\n<li><strong>Self-hosted WooCommerce analytics<\/strong>: sales, AOV, conversion, funnels, geo data, customer LTV, RFM, cohort retention, no third-party<\/li>\n<li>A free Metorik and Triple Whale alternative: analytics, ROAS and profit on your own server<\/li>\n<li><strong>Shopify alternative for WooCommerce<\/strong>: the clean admin experience of Shopify with your storefront, customer data and orders on your own server<\/li>\n<\/ul>\n\n<h3>Why BrikPanel and not the default WooCommerce admin?<\/h3>\n\n<p>WooCommerce's built-in analytics are slow, refresh hourly, and have no live visitor tracking, conversion funnel, geographic data, customer LTV \/ RFM \/ cohort reports, Cmd+K order search, quick edit sidebar, variation bulk editor, custom login or coupon manager. BrikPanel fixes every one of those gaps inside a single <strong>free WooCommerce admin plugin<\/strong>.<\/p>\n\n<h3>WooCommerce HPOS Compatibility &amp; Performance<\/h3>\n\n<ul>\n<li><strong>Zero impact on storefront speed<\/strong>: only loads inside wp-admin<\/li>\n<li><strong>Hardened performance for low-resource hosting<\/strong>: heavy queries are batched, cached and run through Action Scheduler so the dashboard, customer analytics and bulk editor stay responsive on shared hosting<\/li>\n<li><strong>HPOS (High-Performance Order Storage)<\/strong> fully supported with dual code paths<\/li>\n<li>WooCommerce 7.x, 8.x, and newer; works alongside Admin Menu Editor, Slider Revolution, Yoast SEO, RankMath, WPML, Polylang<\/li>\n<li>Translation-ready (<code>.pot<\/code> file included), with all JavaScript \/ jQuery strings routed through <code>wp_localize_script<\/code><\/li>\n<li>All AJAX actions verify nonces and <code>manage_woocommerce<\/code> capability; DB writes use prepared statements; visitor IPs stored only as truncated salted SHA-256 hashes; admin activity excluded from analytics; front-end tracking can be disabled entirely from settings<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/brikpanel<\/code>, or install via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Activate through the <strong>Plugins<\/strong> menu.<\/li>\n<li>Open <strong>BrikPanel<\/strong> in the admin sidebar, the dashboard loads immediately.<\/li>\n<li>(Optional) Visit <strong>WooCommerce \u2192 Settings \u2192 BrikPanel<\/strong> to enable or disable specific modules.<\/li>\n<\/ol>\n\n<p>That is it. No license key, no email signup, no external account.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20brikpanel%20really%20100%25%20free%3F\"><h3>Is BrikPanel really 100% free?<\/h3><\/dt>\n<dd><p>Yes. Every feature on this page is in the free version. There is no premium tier, no feature lock, no trial period, no upsell. We built this because we needed it for our own 1000+ WooCommerce stores and decided to release it.<\/p><\/dd>\n<dt id=\"is%20brikpanel%20a%20self-hosted%20woocommerce%20analytics%20solution%3F\"><h3>Is BrikPanel a self-hosted WooCommerce analytics solution?<\/h3><\/dt>\n<dd><p>Yes. BrikPanel gives you a complete WooCommerce analytics suite that runs entirely on your own server with no external dependencies. Sales analytics, product reports, conversion tracking, customer LTV, RFM segmentation, cohort retention and customer data are all included, nothing is sent to any third-party SaaS.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20include%20a%20woocommerce%20sales%20report%3F\"><h3>Does BrikPanel include a WooCommerce sales report?<\/h3><\/dt>\n<dd><p>Yes. The BrikPanel dashboard ships a complete <strong>WooCommerce sales report<\/strong> out of the box, total sales, total orders, average order value (AOV), refunds, and net revenue, each with a \u00b1% period-over-period delta. Filter the sales report by today, yesterday, last 7 days, last 30 days, or any custom date range. The sales chart is rendered with Chart.js and pairs with the order status donut and conversion funnel for a full sales report you can read at a glance, without ever leaving wp-admin and without paying for an external analytics service.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20offer%20custom%20woocommerce%20reports%2C%20kpis%20and%20a%20profit%20report%3F\"><h3>Does BrikPanel offer custom WooCommerce reports, KPIs and a profit report?<\/h3><\/dt>\n<dd><p>Yes. The dashboard goes far beyond the built-in screens with a complete set of <strong>WooCommerce reports<\/strong> and <strong>WooCommerce sales analytics<\/strong> computed live from your own store data: sales, orders, AOV, conversion rate, customer LTV, RFM segments and cohort retention. Every headline metric is shown as a <strong>WooCommerce KPI<\/strong> card with a period-over-period delta, and a real <strong>profit report<\/strong> (revenue minus COGS, ad spend and manual expenses) sits right next to revenue. Because the LTV, RFM, cohort and geographic views are not part of core, BrikPanel effectively ships <strong>advanced reports<\/strong> for <strong>WooCommerce<\/strong> and <strong>custom WooCommerce reports<\/strong> as a free, self-hosted <strong>WooCommerce reporting<\/strong> layer, with no external SaaS and nothing sent off your server.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20dashboard%20widgets%2C%20sales%20charts%20and%20graphs%3F\"><h3>Can I customize the dashboard widgets, sales charts and graphs?<\/h3><\/dt>\n<dd><p>Yes. The BrikPanel <strong>admin dashboard<\/strong> is built from modular <strong>dashboard widgets<\/strong> (sales, orders, AOV, the conversion funnel, live visitors, the geographic globe, customer analytics and more), and the modules you do not need can be turned off from <strong>WooCommerce \u2192 Settings \u2192 BrikPanel<\/strong>. The <strong>sales charts<\/strong> and <strong>sales graphs<\/strong> are rendered with Chart.js and redraw for any date range you pick, so your <strong>custom dashboard<\/strong> shows exactly the <strong>sales charts<\/strong>, KPIs and reports you care about and nothing you do not.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20work%20with%20multi-currency%20stores%20%28curcy%2C%20wcml%29%3F\"><h3>Does BrikPanel work with multi-currency stores (CURCY, WCML)?<\/h3><\/dt>\n<dd><p>Yes. When your store takes orders in more than one currency, BrikPanel converts every order to your store's base currency before summing, so Revenue, AOV and the sales chart are never a meaningless mix of currencies. With <strong>CURCY (WooCommerce Multi Currency)<\/strong> the exact day-of-sale rate is read from the snapshot CURCY stores on each order. With <strong>WCML (WooCommerce Multilingual &amp; Multicurrency)<\/strong> the current WCML rate is applied and snapshotted onto the order the moment it is placed, which captures the day-of-sale rate for every order going forward. For any other multi-currency setup you can enter flat fallback rates under <strong>WooCommerce \u2192 Settings \u2192 BrikPanel \u2192 Currency<\/strong>, or supply a rate programmatically through the <code>brikpanel_order_base_factor<\/code> filter (parameters: current factor, <code>WC_Order<\/code>, order currency, base currency \u2014 return the multiplier that converts one unit of the order currency into the base currency).<\/p><\/dd>\n<dt id=\"where%20does%20brikpanel%20read%20cost%20of%20goods%20%28cogs%29%20from%3F%20can%20i%20use%20my%20own%20cost%20field%3F\"><h3>Where does BrikPanel read Cost of Goods (COGS) from? Can I use my own cost field?<\/h3><\/dt>\n<dd><p>BrikPanel reads product cost from <strong>WooCommerce's own native Cost of Goods Sold field<\/strong> (<code>_cogs_total_value<\/code>, WooCommerce 9.5+) \u2014 the same field the WooCommerce product screen edits \u2014 so any plugin or import pipeline that writes the native cost is picked up automatically, including direct database writes. Costs saved by older BrikPanel versions are migrated into the native field automatically. Variation costs follow WooCommerce's semantics, including the \"additive\" flag that adds a variation's cost on top of the parent's. If you keep cost somewhere else entirely, hook the <code>brikpanel_product_cogs<\/code> filter (parameters: resolved cost or null, product id, variation id) to point BrikPanel's per-product cost reads at your own source.<\/p><\/dd>\n<dt id=\"can%20i%20turn%20off%20brikpanel%27s%20front-end%20visitor%20tracking%3F\"><h3>Can I turn off BrikPanel's front-end visitor tracking?<\/h3><\/dt>\n<dd><p>Yes. If you already run a dedicated analytics tool, disable <strong>Visitor tracking<\/strong> under <strong>WooCommerce \u2192 Settings \u2192 BrikPanel \u2192 Analytics<\/strong> and BrikPanel adds zero scripts and zero requests to your storefront. You can also keep tracking on but raise the live-visitor refresh interval to reduce server load, or exclude logged-in customer details from the Live view for a fully anonymous setup. If you only want tracking to wait for cookie consent rather than switching it off, see the next question.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20work%20with%20a%20cookie%20consent%20banner%3F%20%28gdpr%20%2F%20consent%20mode%29\"><h3>Does BrikPanel work with a cookie consent banner? (GDPR \/ consent mode)<\/h3><\/dt>\n<dd><p>Yes. Tick <strong>Wait for cookie consent<\/strong> under <strong>WooCommerce \u2192 Settings \u2192 BrikPanel \u2192 Analytics<\/strong> and BrikPanel's visitor tracking creates no cookie, no browser storage and no request at all until the visitor allows analytics. Consent is accepted from any of three sources, so any consent platform can drive it:<\/p>\n\n<ul>\n<li>the <strong>WordPress Consent API<\/strong> (the <code>statistics<\/code> category), which BrikPanel also listens to for live changes;<\/li>\n<li>a banner calling <strong><code>brikpanel_start_tracking()<\/code><\/strong> in JavaScript, with <strong><code>brikpanel_stop_tracking()<\/code><\/strong> on withdrawal;<\/li>\n<li>the <strong><code>brikpanel_frontend_tracking_allowed<\/code><\/strong> PHP filter, for agencies wiring up a CMP without touching plugin files.<\/li>\n<\/ul>\n\n<p>Consent takes effect immediately, with no page reload. When it is withdrawn, tracking stops at once and BrikPanel deletes its own cookies and browser storage for that visitor and drops them from the Live view. The anonymous daily totals already recorded are untouched, because they contain no visitor identifier to erase.<\/p>\n\n<p>Tested against the most-installed consent banners. Working with no setup at all: <strong>Complianz<\/strong>, <strong>CookieYes<\/strong>, <strong>GDPR Cookie Compliance (Moove)<\/strong>, <strong>WPConsent<\/strong>, <strong>Cookiebot<\/strong>, <strong>iubenda<\/strong> and <strong>Beautiful Cookie Consent Banner<\/strong> \u2014 they all speak the WordPress Consent API, so ticking the setting is the only step. <strong>Cookie Notice \/ Compliance by Hu-manity<\/strong> needs its Compliance mode connected, because its free unconnected mode never reports a category decision. <strong>CookieAdmin<\/strong>, <strong>Real Cookie Banner<\/strong> and <strong>Termly<\/strong> do not use the WordPress Consent API at all; bridge them with a few lines, using the pattern below (this exact snippet was tested against CookieAdmin, swap the cookie name and button ids for another banner):<\/p>\n\n<pre><code>add_filter( 'brikpanel_frontend_tracking_allowed', function ( $allowed ) {\n    return isset( $_COOKIE['my_banner_cookie'] ) &amp;&amp; $_COOKIE['my_banner_cookie'] === 'accepted';\n} );\n<\/code><\/pre>\n\n<p>and in your theme's footer, so a click takes effect without a reload:<\/p>\n\n<pre><code>document.addEventListener('click', function (e) {\n    if (e.target.closest('#my-banner-accept') &amp;&amp; window.brikpanel_start_tracking) window.brikpanel_start_tracking();\n    if (e.target.closest('#my-banner-reject') &amp;&amp; window.brikpanel_stop_tracking) window.brikpanel_stop_tracking();\n}, true);\n<\/code><\/pre>\n\n<p>What visitor tracking stores in the browser, and only after consent when the setting is on: <code>brikpanel_vid<\/code> (a random id, 1 year, so a visit is counted once instead of once per page), <code>brikpanel_consent<\/code> (the value <code>1<\/code>, 30 days, remembering the choice), <code>brikpanel_add_to_cart_count_cookie<\/code> and <code>brikpanel_checkout_count_cookie<\/code> (until midnight, one funnel count per day), and the local storage keys <code>brikpanel_visitor_viewed_&lt;date&gt;<\/code> and <code>brikpanel_product_viewed_&lt;date&gt;<\/code>. All of it is first-party and stays on your own site.<\/p>\n\n<p>This setting governs analytics. Abandoned-cart email capture is a separate feature with its own switch under <strong>Cart abandonment<\/strong>, and it stores nothing at all until a customer types their email address themselves; when they do, it reuses the same <code>brikpanel_vid<\/code> id to tie the cart to that address.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20support%20wordpress%20multisite%3F\"><h3>Does BrikPanel support WordPress multisite?<\/h3><\/dt>\n<dd><p>Yes, both ways: network-activate it to run on every store in the network, or activate it on individual subsites only. Each site gets its own tables and settings either way. When network-activated, super admins additionally get network-wide access rules under <strong>Network Admin \u2192 Settings \u2192 BrikPanel Access<\/strong>.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20show%20customer%20ltv%2C%20rfm%20segments%20and%20cohort%20retention%3F\"><h3>Does BrikPanel show customer LTV, RFM segments and cohort retention?<\/h3><\/dt>\n<dd><p>Yes. BrikPanel ships a full <strong>WooCommerce customer analytics<\/strong> suite directly in the dashboard. Customer Lifetime Value (LTV) is calculated for every customer with average, top, and full distribution histogram. RFM segmentation scores every customer on Recency, Frequency and Monetary and groups them into Champions, Loyal, At Risk, About to Sleep, Hibernating and Lost. Cohort retention shows a month-by-month grid plus an average retention trend line. All three are computed from your own store data, no external service involved.<\/p><\/dd>\n<dt id=\"is%20brikpanel%20a%20free%20shopify%20alternative%20for%20woocommerce%3F\"><h3>Is BrikPanel a free Shopify alternative for WooCommerce?<\/h3><\/dt>\n<dd><p>Yes, for store owners who want to stay self-hosted. BrikPanel gives your WooCommerce store the clean, modern admin experience of Shopify: product list with inline editing, bulk price and stock updates, live visitors, conversion tracking, geographic analytics, customer LTV \/ RFM \/ cohort reports, a branded login page, but your storefront, your customer data, and your orders stay on your own server. No monthly platform fee, no transaction fee, no vendor lock-in. If you were evaluating Shopify but want to own your stack, this is the <strong>Shopify alternative for WooCommerce<\/strong> we built for that exact use case.<\/p><\/dd>\n<dt id=\"is%20brikpanel%20an%20atum%20alternative%20for%20inventory%20management%3F\"><h3>Is BrikPanel an ATUM alternative for inventory management?<\/h3><\/dt>\n<dd><p>For most stores, yes. BrikPanel includes complete <strong>woocommerce inventory management<\/strong>: stock levels, low stock badges, bulk stock updates, variation stock updates, all integrated into the same dashboard you use for sales and orders. If you only need daily stock work without advanced supplier or purchase order features, BrikPanel is a much lighter <strong>ATUM alternative<\/strong>.<\/p><\/dd>\n<dt id=\"how%20do%20i%20get%20a%20faster%20woocommerce%20product%20list%20with%20bulk%20actions%20and%20quick%20edit%3F\"><h3>How do I get a faster WooCommerce product list with bulk actions and quick edit?<\/h3><\/dt>\n<dd><p>The default <strong>WooCommerce product list<\/strong> is built for browsing, searching, sorting and editing it is slow. BrikPanel ships a complete <strong>woocommerce product list plugin<\/strong> with thumbnail, SKU, regular and sale price, stock badge, category, AJAX pagination, live search, status tabs, one-click publish toggle and a slide-in quick edit panel for every row. Works on both simple and variable products, and the same <strong>woocommerce product list<\/strong> screen powers the bulk price and bulk stock updates so you never leave the page to edit your catalog.<\/p><\/dd>\n<dt id=\"can%20i%20search%20products%20by%20my%20own%20sku%20field%2C%20like%20a%20supplier%20or%20manufacturer%20code%3F\"><h3>Can I search products by my own SKU field, like a supplier or manufacturer code?<\/h3><\/dt>\n<dd><p>Yes. The product list search matches the product title, the description and the WooCommerce SKU out of the box, including a variation SKU, which returns the parent product. If your warehouse also stamps a supplier code, a manufacturer part number or an EAN onto each product in its own custom field, point BrikPanel at it with the <code>brikpanel_product_search_meta_keys<\/code> filter, which receives the list of meta keys (just <code>_sku<\/code> by default) and the search term. Add your own key to the list and staff can find a product by typing it, on simple and variable products alike, because a match on a variation returns the parent. Up to ten keys are scanned. The filter is documented with a copyable example under WooCommerce, Settings, BrikPanel, Developers.<\/p><\/dd>\n<dt id=\"how%20do%20i%20bulk%20edit%20woocommerce%20products%20including%20variations%3F\"><h3>How do I bulk edit WooCommerce products including variations?<\/h3><\/dt>\n<dd><p>Open <strong>BrikPanel \u2192 Products<\/strong> and click the <strong>Bulk Update<\/strong> button in the toolbar. You can update prices, sale prices, and stock for all products, by category, or for selected products. For variable products, open any product, click <strong>Edit Variations<\/strong>, and bulk update prices and stock across every variation in one modal. This is the part most free <strong>WooCommerce bulk editor<\/strong> plugins do not handle, BrikPanel does.<\/p><\/dd>\n<dt id=\"can%20i%20bulk%20edit%20variation%20prices%20in%20woocommerce%20with%20the%20free%20version%3F\"><h3>Can I bulk edit variation prices in WooCommerce with the free version?<\/h3><\/dt>\n<dd><p>Yes. <strong>Bulk edit variation prices WooCommerce<\/strong> is a core BrikPanel feature, and it is free. Set a percentage rule, set a fixed price, or update by attribute (every \"Red\" variation, every \"Large\" size). The same modal handles <strong>bulk update variation stock<\/strong> for the same products.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20slow%20down%20my%20woocommerce%20store%3F\"><h3>Does BrikPanel slow down my WooCommerce store?<\/h3><\/dt>\n<dd><p>No. BrikPanel only loads inside wp-admin. It has zero impact on your storefront speed, customer experience, page weight, or Core Web Vitals. The frontend never loads any BrikPanel code.<\/p><\/dd>\n<dt id=\"is%20brikpanel%20compatible%20with%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Is BrikPanel compatible with HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes. Every order query has dual code paths, <code>wc_get_orders()<\/code> for HPOS, <code>WP_Query<\/code> for legacy. BrikPanel declares HPOS compatibility via <code>FeaturesUtil::declare_compatibility('custom_order_tables', ...)<\/code> and is tested on stores running both modes.<\/p><\/dd>\n<dt id=\"how%20do%20i%20see%20woocommerce%20sales%20by%20country%3F\"><h3>How do I see WooCommerce sales by country?<\/h3><\/dt>\n<dd><p>Open the BrikPanel dashboard. Scroll to the geographic analytics section. The 3D globe shows every order on its real geographic location, and the <strong>Top 10 Countries<\/strong> and <strong>Top 10 Cities<\/strong> tables update in real time. BrikPanel extracts country and city from the billing or shipping address of every order, so this works with no extra setup.<\/p><\/dd>\n<dt id=\"how%20do%20i%20customize%20the%20wordpress%20login%20page%20for%20my%20woocommerce%20store%3F\"><h3>How do I customize the WordPress login page for my WooCommerce store?<\/h3><\/dt>\n<dd><p>BrikPanel includes a built-in <strong>wordpress login customizer<\/strong>. Enable the <strong>custom wp login page<\/strong> module from BrikPanel settings and the default <code>wp-login.php<\/code> is replaced with a clean, branded login form that matches the rest of the BrikPanel admin. No CSS knowledge required.<\/p><\/dd>\n<dt id=\"how%20do%20i%20search%20woocommerce%20orders%20by%20customer%20name%20or%20phone%20number%3F\"><h3>How do I search WooCommerce orders by customer name or phone number?<\/h3><\/dt>\n<dd><p>Press <code>Ctrl + K<\/code> (or <code>Cmd + K<\/code> on Mac) anywhere inside wp-admin. The BrikPanel quick search overlay opens and searches across order ID, customer name, email, phone, and product SKU at the same time. This is the <strong>woocommerce search orders<\/strong> experience the WooCommerce admin should ship with by default.<\/p><\/dd>\n<dt id=\"can%20i%20see%20who%20is%20on%20my%20woocommerce%20store%20right%20now%3F\"><h3>Can I see who is on my WooCommerce store right now?<\/h3><\/dt>\n<dd><p>Yes. BrikPanel includes a <strong>woocommerce live visitors<\/strong> widget on the dashboard that updates every 30 seconds. You can see what page each visitor is on, whether they have items in the cart, and whether they are an existing customer. This is real <strong>woocommerce real time visitors<\/strong> tracking, not estimates.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20track%20woocommerce%20conversion%20rate%20and%20conversion%20funnel%3F\"><h3>Does BrikPanel track WooCommerce conversion rate and conversion funnel?<\/h3><\/dt>\n<dd><p>Yes. BrikPanel includes a complete <strong>woocommerce conversion tracking<\/strong> system that records visitors, add-to-cart events, checkout starts, and completed orders. The dashboard shows your <strong>woocommerce conversion funnel<\/strong> as a four-step visual: Visitors \u2192 Add to Cart \u2192 Checkout \u2192 Orders, with the conversion percentage at every step.<\/p><\/dd>\n<dt id=\"is%20there%20a%20free%20woocommerce%20conversion%20tracking%20plugin%20built%20into%20brikpanel%3F\"><h3>Is there a free WooCommerce conversion tracking plugin built into BrikPanel?<\/h3><\/dt>\n<dd><p>Yes. BrikPanel ships a free <strong>WooCommerce conversion tracking plugin<\/strong> that records every visitor, add-to-cart, checkout start and completed order in your own database, no Google Analytics setup, no Hotjar, no monthly fee. The funnel and conversion-rate widgets on the dashboard are computed from this same dataset in real time.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20recover%20abandoned%20carts%3F\"><h3>Does BrikPanel recover abandoned carts?<\/h3><\/dt>\n<dd><p>Yes. BrikPanel includes a built-in <strong>WooCommerce cart abandonment<\/strong> and <strong>cart recovery<\/strong> system in the free version: no Klaviyo, Mailchimp or external email SaaS. It captures the email of shoppers who begin checkout but do not complete the order (from both the classic shortcode checkout and the newer block checkout, and from logged-in customers the moment they add to cart) and lists every one on a dedicated <strong>Abandoned Carts<\/strong> screen. Each entry keeps a full snapshot of the cart, including the exact variation, quantity and total, and moves through Active, Abandoned and Recovered automatically, even if the shopper later checks out with a different email. The screen has search, status, source and date filters, per-row product details, CSV and Excel export, and statistics cards. It works on both simple and variable products.<\/p><\/dd>\n<dt id=\"how%20does%20the%20woocommerce%20cart%20recovery%20coupon%20popup%20work%3F\"><h3>How does the WooCommerce cart recovery coupon popup work?<\/h3><\/dt>\n<dd><p>Switch on the optional email popup and BrikPanel shows a clean, on-brand sign-up offer to your visitors. Anyone who subscribes is issued their own single-use percentage <strong>cart recovery coupon<\/strong> (10% by default, and you set the rate), restricted to their email and valid for 30 days, shown right there with a one-click Copy button. You control the heading, message, button and success text, the delay before it appears, the cooldown after it is dismissed, and which of six animated reveal styles the coupon uses (Sealed envelope, Pocket card, Scratch card, Slot machine, Magnetic assembly or Classic ticket), all of which respect a visitor's reduced-motion preference. Close the popup and it folds into a small floating tab, one click from reopening.<\/p><\/dd>\n<dt id=\"how%20do%20i%20sync%20woocommerce%20orders%20to%20google%20sheets%20for%20free%3F\"><h3>How do I sync WooCommerce orders to Google Sheets for free?<\/h3><\/dt>\n<dd><p>Open <strong>WooCommerce \u2192 BrikPanel \u2192 Google Sheets<\/strong>, click \"Connect Google account\", pick or create a target spreadsheet, and toggle \"Real-time order sync\" on. Every new WooCommerce order is then appended to your Sheet within seconds, with one row per line item so variations land in their own columns. Status changes update the existing row in place. No Zapier, no Make, no monthly fee, a real <strong>woocommerce google sheets sync<\/strong> built into BrikPanel.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20work%20as%20a%20free%20gsheetconnector%20or%20wpsyncsheets%20alternative%3F\"><h3>Does BrikPanel work as a free GSheetConnector or WPSyncSheets alternative?<\/h3><\/dt>\n<dd><p>Yes. BrikPanel includes a complete <strong>WooCommerce to Google Sheets<\/strong> integration in the free version: real-time order sync, scheduled bulk export, analytics snapshot tabs (Sales Summary, Daily KPIs, Top Products, Funnel) and a customer + RFM snapshot. All four flows ship free with no row limit, no premium tier, and OAuth-based authentication that requests minimum scopes only (<code>drive.file<\/code>, never full Drive access).<\/p><\/dd>\n<dt id=\"how%20do%20i%20see%20real%20roas%20and%20net%20profit%20in%20woocommerce%3F\"><h3>How do I see real ROAS and net profit in WooCommerce?<\/h3><\/dt>\n<dd><p>Connect <strong>Google Ads<\/strong> and\/or <strong>Meta Ads<\/strong> from the BrikPanel Ad Platforms page. BrikPanel then pulls your daily ad spend and shows three new dashboard cards: <strong>Ad Spend<\/strong> (summed across every connected platform for the active date range), <strong>WooCommerce ROAS<\/strong> (store revenue \u00f7 ad spend), and <strong>Net Profit<\/strong> (revenue \u2212 COGS \u2212 ad spend \u2212 manual expenses). COGS comes from WooCommerce's native order cost meta and expenses from the BrikPanel expenses table, so the <strong>woocommerce roas<\/strong> and net profit numbers are real, not estimates. The cards are multi-currency aware, if an ad account reports in a different currency than the store, spend is shown split and ROAS \/ Net Profit are omitted instead of printing a misleading converted number.<\/p><\/dd>\n<dt id=\"is%20brikpanel%20a%20free%20triple%20whale%20alternative%20for%20woocommerce%3F\"><h3>Is BrikPanel a free Triple Whale alternative for WooCommerce?<\/h3><\/dt>\n<dd><p>For self-hosted stores, yes. BrikPanel gives you the <strong>WooCommerce ROAS<\/strong> and <strong>net profit<\/strong> view store owners buy Triple Whale, TrueProfit or BeProfit for: daily <strong>Google Ads<\/strong> and <strong>Meta Ads<\/strong> spend pulled in next to store revenue, COGS and expenses, but it runs entirely on your own server with no monthly fee and no data sent to a third party. If you only need true ROAS and profit (not full multi-touch ad attribution), this is the free <strong>Triple Whale alternative<\/strong> built for that exact use case.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20connect%20to%20google%20ads%20and%20meta%20%28facebook%20%2F%20instagram%29%20ads%3F\"><h3>Does BrikPanel connect to Google Ads and Meta (Facebook \/ Instagram) Ads?<\/h3><\/dt>\n<dd><p>Yes. BrikPanel connects to both <strong>Google Ads<\/strong> and <strong>Meta Ads<\/strong> through a secure OAuth proxy (the plugin only ever stores encrypted tokens, never your password). It pulls daily spend per platform, backfills history, and re-syncs recent days automatically so the dashboard ROAS and net profit stay accurate. The integration is spend-and-profit focused, it does not install a Facebook pixel or do multi-touch attribution; it gives you true <strong>woocommerce roas<\/strong> and net profit without a paid SaaS.<\/p><\/dd>\n<dt id=\"is%20there%20a%20free%20woocommerce%20variation%20editor%20for%20bulk%20price%20and%20stock%20updates%3F\"><h3>Is there a free WooCommerce variation editor for bulk price and stock updates?<\/h3><\/dt>\n<dd><p>Yes. BrikPanel includes a complete <strong>WooCommerce variation editor<\/strong> in the free version. Open any variable product, click \"Edit Variations\", and you can bulk update every variation's price, sale price, stock and SKU in one modal, with attribute filtering when a product has 50+ combinations. The same <strong>woocommerce variation editor<\/strong> also supports per-attribute rules (\"set every Red variation to $X\").<\/p><\/dd>\n<dt id=\"what%20makes%20brikpanel%20different%20from%20the%20built-in%20woocommerce%20analytics%3F\"><h3>What makes BrikPanel different from the built-in WooCommerce analytics?<\/h3><\/dt>\n<dd><p>The built-in WooCommerce analytics are slow, refresh on a delay, only show historical data, and have no live visitor tracking, no conversion funnel, no geographic globe, no customer LTV \/ RFM \/ cohort reports, no Cmd+K order search, no quick edit sidebar, no variation bulk editor, no custom login page, and no coupon manager. BrikPanel adds every one of those features inside a single free plugin.<\/p><\/dd>\n<dt id=\"is%20brikpanel%20just%20a%20css%20reskin%20of%20the%20woocommerce%20admin%3F\"><h3>Is BrikPanel just a CSS reskin of the WooCommerce admin?<\/h3><\/dt>\n<dd><p>No. BrikPanel is a real <strong>woocommerce admin dashboard plugin<\/strong> with custom database tables for visitor tracking, custom AJAX endpoints for every interaction, real conversion analytics, a working bulk editor, a real product editor, a real coupon manager, and a real custom login system. Other plugins (Dashify, UiPress) only restyle the admin. BrikPanel rebuilds the parts of WooCommerce that needed to be rebuilt.<\/p><\/dd>\n<dt id=\"can%20i%20use%20brikpanel%20as%20a%20wordpress%20admin%20theme%20or%20admin%20skin%20for%20my%20store%3F\"><h3>Can I use BrikPanel as a WordPress admin theme or admin skin for my store?<\/h3><\/dt>\n<dd><p>In practice, yes. BrikPanel is built specifically for WooCommerce, but for store owners it behaves like a focused <strong>WordPress admin theme<\/strong>: it reskins the WooCommerce parts of wp-admin into a clean, Shopify-style <strong>custom admin panel<\/strong>, replaces the default toolbar, and restyles the product, order, customer and coupon screens. If you have been looking for a <strong>wp admin theme<\/strong> or an <strong>admin skin<\/strong> that makes the WooCommerce admin genuinely pleasant to work in (rather than a generic restyle that breaks on the next WooCommerce update), this is built for exactly that. You can also <strong>hide admin menu<\/strong> items for non-technical clients with the optional simplified mode, leaving only BrikPanel and WooCommerce in the sidebar.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20work%20with%20yoast%20seo%2C%20rankmath%2C%20elementor%2C%20wpml%2C%20and%20polylang%3F\"><h3>Does BrikPanel work with Yoast SEO, RankMath, Elementor, WPML, and Polylang?<\/h3><\/dt>\n<dd><p>Yes. BrikPanel does not interfere with frontend rendering, so it works with every page builder and SEO plugin we have tested. Yoast SEO, Rank Math, All in One SEO and SEOPress metaboxes (including their SEO score panels) render and save inside the BrikPanel product editor. It also has its own translation files and is fully compatible with WPML and Polylang for multilingual stores.<\/p><\/dd>\n<dt id=\"does%20brikpanel%20work%20with%20woocommerce%20subscriptions%20and%20membership%20plugins%3F\"><h3>Does BrikPanel work with WooCommerce Subscriptions and membership plugins?<\/h3><\/dt>\n<dd><p>Yes. BrikPanel is compatible with 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. Subscription products and member orders show up in the same product list, order screens and customer analytics as the rest of your catalog.<\/p><\/dd>\n<dt id=\"where%20does%20brikpanel%20store%20data%3F\"><h3>Where does BrikPanel store data?<\/h3><\/dt>\n<dd><p>Everything stays in your WordPress database. Visitor tracking writes to <code>wp_brikpanel_visitors<\/code> (daily totals), <code>wp_brikpanel_visited_pages<\/code>, <code>wp_brikpanel_referrers<\/code> and <code>wp_brikpanel_cart_tracking<\/code> \u2014 all anonymous counters with no visitor identifier in them. Other features add their own tables as you use them (expenses, suppliers, customer metrics, abandoned carts). Live visitor data is stored in a transient that auto-expires every 2 minutes and is never written to the database permanently. Your store, order, customer and visitor data is never sent anywhere. BrikPanel only contacts an external service for optional features you switch on yourself, described in the next question.<\/p><\/dd>\n<dt id=\"what%20data%20does%20brikpanel%20send%20outside%20my%20site%3F\"><h3>What data does BrikPanel send outside my site?<\/h3><\/dt>\n<dd><p>By default, nothing. BrikPanel only contacts an external service for features you explicitly opt into:<\/p>\n\n<ul>\n<li><strong>BrikMentor early access (optional).<\/strong> After 100 completed orders, or from a dismissible card on the dashboard, BrikPanel may invite you to join the waiting list for BrikMentor, an upcoming separate AI assistant and email marketing platform. Only if you type your email address and tick the consent box is that email (and, if you answer the optional follow-up, which marketing tool you use) sent to our server at brksoft.com so we can email you the beta invite. Nothing is sent unless you fill in the form and consent, and you can unsubscribe at any time. Privacy policy: https:\/\/brksoft.com\/privacy-policy\/ . Terms: https:\/\/brksoft.com\/terms-and-conditions\/<\/li>\n<li><strong>Google Sheets sync and Google \/ Meta Ads (optional).<\/strong> If you connect these, BrikPanel exchanges data with Google, Meta and our authentication helper at brksoft.com to run the sync and read your ad spend. They only run after you connect the relevant account.<\/li>\n<\/ul><\/dd>\n<dt id=\"will%20brikpanel%20always%20be%20free%3F\"><h3>Will BrikPanel always be free?<\/h3><\/dt>\n<dd><p>Yes. The dashboard, the bulk editor, the inventory tools, the order management, the coupon manager, the custom login, the conversion tracking, the customer analytics suite, and every other feature listed above will remain free forever. We may release a separate paid product (BrikMentor) on top of BrikPanel in the future, but it will be additive, BrikPanel itself stays 100% free.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.2.84 (2026-08-27)<\/h4>\n\n<ul>\n<li>Fix: <strong>Payment fees are now read from more payment plugins, not just the official Stripe and PayPal ones.<\/strong> The \"Payment fees\" expense line only looked at the fields written by official Stripe, older PayPal Standard and WooPayments, so a store taking cards through FunnelKit Stripe or the Payment Plugins PayPal gateway had the setting switched on and still saw nothing: the total came out at zero, and a zero line was hidden, which reads as a broken feature rather than as no data. Both gateways are now read. The currency of a fee is also taken from the field belonging to the gateway that wrote it instead of one shared field, so a fee charged in another currency is converted rather than quietly treated as being in the order's currency. When the setting is on and the total is still zero, the Expenses card now says so instead of hiding the line.<\/li>\n<li>Fix: <strong>A one-day range on the dashboard chart no longer draws two days.<\/strong> The chart grouped orders by the UTC calendar day while the range itself was your local day, so on every store outside UTC a single-day selection produced two points, the first labelled with yesterday's date. Days are now folded to your store's timezone, correctly on whole-hour, half-hour and quarter-hour offsets and across daylight saving changes. The totals in the cards above the chart were always right; only the chart was wrong.<\/li>\n<li>Fix: <strong>\"Last 7 Days\" now covers 7 days rather than 8.<\/strong> The 7, 30 and 90 day ranges each reached back one day too far, and because the previous period they were compared against was the correct length, the percentage change shown beside each figure was off as well. Your numbers will move slightly as a result: they are now the numbers the label promises.<\/li>\n<li>Fix: <strong>The advertising card no longer counts a day's sales as pure profit.<\/strong> Its own cost-of-goods lookup compared local dates against a date stored in UTC, which on a single-day range narrowed the window to about an hour and found nothing, so product cost was left out of that card's profit entirely.<\/li>\n<li>Fix: <strong>A Google Sheets order sync can no longer repeat the same orders forever without writing anything.<\/strong> After exporting a batch, the sync marks each order as sent. That mark was written straight to the database, and if it landed in one table while the part that looks for unsent orders reads another, which is what happens on a store part-way through WooCommerce's move to its own order tables, the database reported a perfect success and the mark never appeared. The same orders were picked up again on the next run, and every run after that, each one writing no rows at all. The mark is now read back from the table the sync actually reads, and any order missing it is recorded again through WooCommerce itself.<\/li>\n<li>Fix: <strong>A brief outage of BrikPanel's Google session service no longer looks like a lost connection.<\/strong> When the service that renews your Google session could not be reached, the sync reported that your connection had been disconnected, which sent store owners hunting for a fault on their own hosting. It now says the interruption is temporary and that the sync will carry on by itself.<\/li>\n<li>Developer: <code>brikpanel_payment_fee_meta_keys<\/code> covers the two new gateway fields, and the new <code>brikpanel_payment_fee_currency_meta_keys<\/code> filter maps each fee field to the field that holds its currency.<\/li>\n<\/ul>\n\n<h4>3.2.83 (2026-08-26)<\/h4>\n\n<ul>\n<li>Fix: <strong>The Products screen and the product editor no longer break on hosts without the Multibyte String PHP library.<\/strong> A store owner reported a Products page that never finished loading, and a critical error under the Category box on Add product, whether or not the store had any products. Both came from the same place: BrikPanel used a text function that this optional PHP library provides, without first checking the library was there. WordPress and WooCommerce both run happily without it, so the store looked fine everywhere else, which is what made it so hard to place. Because every store has at least one product category, the two screens failed on every single load. On the product editor the page stopped right after the \"Category\" heading, so the error was at least visible; on the Products screen it stopped inside the hidden Quick Edit panel, so nothing was shown at all and the loading circle simply turned forever. Every place BrikPanel handles text this way now falls back to a plain-text equivalent when the library is missing, including a lowercase conversion that keeps Turkish, Central European and accented category names searchable rather than leaving them out.<\/li>\n<li>Fix: <strong>The products list now tells you when something went wrong instead of spinning forever.<\/strong> If the server answered with something the list could not read at all, or a column added by another plugin failed while the table was being drawn, the loading circle stayed on screen with no message and no way forward but a page reload. Those cases now clear the circle and show \"An error occurred. Please try again.\" A request that never comes back at all gives up after two minutes and does the same, rather than leaving the screen loading indefinitely.<\/li>\n<li>Fix: <strong>Category and Brand boxes draw quickly on large catalogues, and say so when they are empty.<\/strong> Building the category tree re-read the whole list of categories once for every category in it, which is unnoticeable on a small store and can exhaust the server's memory or time limit on one with thousands, producing a critical error on both the product editor and the products list. The tree is now built in a single pass. An empty Category or Brand box also says \"No categories found.\" \/ \"No brands found.\" instead of showing an empty white area that reads as broken.<\/li>\n<\/ul>\n\n<h4>3.2.82 (2026-08-26)<\/h4>\n\n<ul>\n<li>Fix: <strong>BrikPanel no longer takes a store offline on older WooCommerce versions.<\/strong> On WooCommerce 4.0 through 5.8 the plugin called a scheduling function that those versions do not have, and because the call ran on every page load the result was not a broken feature but a broken site: the storefront, the login page and the whole admin area returned a critical error, and the plugin could not be switched off from the admin or from WP-CLI to undo it. BrikPanel now asks the same question in a way every supported WooCommerce understands, so background jobs are still scheduled exactly once on those versions rather than the plugin simply going quiet. Stores on WooCommerce 5.9 and later were never affected.<\/li>\n<li>Fix: <strong>A background job that cannot start no longer breaks the page it started from.<\/strong> While WooCommerce is moving its scheduled-jobs storage to its newer tables, which happens by itself shortly after a fresh install, it can refuse to accept new jobs. That refusal used to travel up and return a critical error on every page of a brand new store. The job is now simply left for the next page load, which is where it gets picked up.<\/li>\n<li>Fix: <strong>The Scheduled Tasks screen no longer breaks after a job has been cancelled.<\/strong> On WooCommerce 4.0 the list could not draw a cancelled job and the whole screen failed to load, which happened the first time anyone switched a Google Sheets sync off. Rows that cannot be drawn are now left out instead.<\/li>\n<li>Developer: <code>Brikpanel_Cron::has_any_scheduled( $hook )<\/code> answers whether any job is queued for a hook regardless of its arguments. <code>Brikpanel_Cron::REQUIRED_FUNCTIONS<\/code> lists every Action Scheduler function the class depends on, and <code>is_available()<\/code> now checks all of them.<\/li>\n<\/ul>\n\n<h4>3.2.81 (2026-08-25)<\/h4>\n\n<ul>\n<li>Fix: <strong>The \"Follow-ups\" column on the abandoned carts list is no longer drawn when nothing can fill it.<\/strong> With BrikMentor installed but unable to answer, the column appeared on every row and stayed empty, which reads as broken rather than as no data. That covered three real situations: an older BrikMentor that predates the feature, one held back by its own dependency check, and one stopped because WooCommerce is inactive. The column now appears only when something is actually listening. The phone and WhatsApp column is unaffected and keeps working, because BrikPanel builds it from its own data.<\/li>\n<\/ul>\n\n<h4>3.2.80 (2026-08-24)<\/h4>\n\n<ul>\n<li>New: <strong>A \"Clear all\" button empties a product's variation list in one click.<\/strong> Starting a variation matrix over meant deleting every row by hand, one trash icon at a time, which is a long job on a product with fifty variations. The button sits beside \"Generate variations\", asks you to confirm, and then removes them straight away rather than waiting for a save. The product stays a variable product and keeps its attributes, so the next click can be \"Generate variations\" to build a fresh matrix. Variations that a third-party plugin had hidden as drafts are removed too, so nothing is left behind to reappear later. Large matrices are cleared in batches, so a product with thousands of variations finishes instead of timing out. This also fixes a related problem: saving a product whose variation list had been emptied used to turn it into a simple product and drop its variation attributes.<\/li>\n<\/ul>\n\n<h4>3.2.79 (2026-08-24)<\/h4>\n\n<ul>\n<li>New: <strong>Payment processing fees are counted as an expense, using the real amount your provider charged.<\/strong> Stripe, PayPal and WooPayments already record what they deducted from each order, but that figure was never read, so the only way to account for card commission was to guess it with a percentage-of-revenue cost. The real per-order amount is now taken straight from the order and shown as its own \"Payment fees\" line in the expenses breakdown, so foreign-card surcharges, currency spreads and refund adjustments are all included instead of averaged away. It also appears in the Excel export and the Google Sheets Profit tab, and you can file your own costs under it. Orders paid another way, such as bank transfer or cash on delivery, simply have no fee. Where fees were found on only some orders, or in a currency with no exchange rate set, the Expenses card says so rather than presenting a partial figure as complete. Switch it on or off at the top of the Operational Expenses screen; it starts on. If you already keep a percentage-based cost for card commission, that screen now warns you it may be counting the same money twice.<\/li>\n<\/ul>\n\n<h4>3.2.78 (2026-08-21)<\/h4>\n\n<ul>\n<li>New: <strong>A \"Variation SKUs\" column shows the codes of a product's variations without opening it.<\/strong> The SKU column shows a variable product's own code, so the only way to see what its variations are called was to open the product. The new column, switched on from the \"Columns\" button on the products list, puts them on the product row: one code prints as itself, several collapse into a small count you hover to read the full list. It reads the code each variation actually has, so a variation that simply inherits the parent's code is not counted as one of its own. The column is off until you turn it on, and adds no extra database work whether it is on or off. Searching already matched variation codes, so you can now find a product by one of its variation SKUs and see that SKU in the list as well.<\/li>\n<\/ul>","raw_excerpt":"Free WooCommerce dashboard &amp; sales report: abandoned cart recovery, Google Sheets sync, ROAS, bulk editor &amp; inventory management","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/es-cr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/226093","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es-cr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/es-cr.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/es-cr.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=226093"}],"author":[{"embeddable":true,"href":"https:\/\/es-cr.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/brksoft"}],"wp:attachment":[{"href":"https:\/\/es-cr.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=226093"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/es-cr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=226093"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/es-cr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=226093"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/es-cr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=226093"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/es-cr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=226093"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/es-cr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=226093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}