{"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-09-22T18:07:40","modified_gmt":"2026-09-22T18:07:40","slug":"brikpanel-admin-panel-dashboard-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/sv.wordpress.org\/plugins\/brikpanel-admin-panel-dashboard-for-woocommerce\/","author":21214773,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.3.20","stable_tag":"3.3.20","tested":"7.1.2","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-09-22 18:07:40","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":1000,"downloads":37082,"num_ratings":48,"support_threads":48,"support_threads_resolved":48,"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},"3.2.90":{"tag":"3.2.90","author":"brksoft","date":"2026-08-28 10:03:22","revision":3670123},"3.2.93":{"tag":"3.2.93","author":"brksoft","date":"2026-08-30 14:43:04","revision":3672694},"3.2.95":{"tag":"3.2.95","author":"brksoft","date":"2026-09-03 05:53:41","revision":3679047},"3.2.96":{"tag":"3.2.96","author":"brksoft","date":"2026-09-04 21:12:36","revision":3681818},"3.2.97":{"tag":"3.2.97","author":"brksoft","date":"2026-09-05 12:28:23","revision":3682435},"3.2.98":{"tag":"3.2.98","author":"brksoft","date":"2026-09-06 15:25:01","revision":3683618},"3.2.99":{"tag":"3.2.99","author":"brksoft","date":"2026-09-07 19:54:39","revision":3685503},"3.3.0":{"tag":"3.3.0","author":"brksoft","date":"2026-09-07 19:54:39","revision":3685503},"3.3.1":{"tag":"3.3.1","author":"brksoft","date":"2026-09-10 10:08:51","revision":3689701},"3.3.10":{"tag":"3.3.10","author":"brksoft","date":"2026-09-17 07:07:54","revision":3699660},"3.3.11":{"tag":"3.3.11","author":"brksoft","date":"2026-09-17 09:52:04","revision":3699981},"3.3.12":{"tag":"3.3.12","author":"brksoft","date":"2026-09-18 10:37:02","revision":3701809},"3.3.13":{"tag":"3.3.13","author":"brksoft","date":"2026-09-18 10:37:02","revision":3701809},"3.3.14":{"tag":"3.3.14","author":"brksoft","date":"2026-09-19 13:49:05","revision":3703337},"3.3.15":{"tag":"3.3.15","author":"brksoft","date":"2026-09-19 14:00:28","revision":3703343},"3.3.16":{"tag":"3.3.16","author":"brksoft","date":"2026-09-20 16:46:03","revision":3704457},"3.3.17":{"tag":"3.3.17","author":"brksoft","date":"2026-09-21 18:42:37","revision":3706155},"3.3.20":{"tag":"3.3.20","author":"brksoft","date":"2026-09-22 18:07:40","revision":3707910},"3.3.3":{"tag":"3.3.3","author":"brksoft","date":"2026-09-13 19:18:04","revision":3694103},"3.3.4":{"tag":"3.3.4","author":"brksoft","date":"2026-09-13 19:18:04","revision":3694103},"3.3.5":{"tag":"3.3.5","author":"brksoft","date":"2026-09-14 11:50:07","revision":3695127},"3.3.6":{"tag":"3.3.6","author":"brksoft","date":"2026-09-15 15:21:40","revision":3697256},"3.3.7":{"tag":"3.3.7","author":"brksoft","date":"2026-09-16 14:25:27","revision":3698778},"3.3.8":{"tag":"3.3.8","author":"brksoft","date":"2026-09-16 19:36:44","revision":3699183},"3.3.9":{"tag":"3.3.9","author":"brksoft","date":"2026-09-16 20:21:11","revision":3699211}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":48},"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":3707910,"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","3.2.90","3.2.93","3.2.95","3.2.96","3.2.97","3.2.98","3.2.99","3.3.0","3.3.1","3.3.10","3.3.11","3.3.12","3.3.13","3.3.14","3.3.15","3.3.16","3.3.17","3.3.20","3.3.3","3.3.4","3.3.5","3.3.6","3.3.7","3.3.8","3.3.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":3697256,"resolution":"17","location":"assets","locale":"","width":1320,"height":1080},"screenshot-18.png":{"filename":"screenshot-18.png","revision":3697256,"resolution":"18","location":"assets","locale":"","width":1920,"height":1080},"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-22.png":{"filename":"screenshot-22.png","revision":3697256,"resolution":"22","location":"assets","locale":"","width":1600,"height":740},"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","22":"Order 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=3697256","caption":"Order Management"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-18.png?rev=3697256","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"},{"src":"https:\/\/ps.w.org\/brikpanel-admin-panel-dashboard-for-woocommerce\/assets\/screenshot-22.png?rev=3697256","caption":"Order 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%20the%20signup%20popup%20appear%20on%20top%20of%20my%20cookie%20banner%3F\"><h3>Does the signup popup appear on top of my cookie banner?<\/h3><\/dt>\n<dd><p>No. <strong>Wait for cookie banner<\/strong> under <strong>WooCommerce \u2192 Settings \u2192 BrikPanel \u2192 Cart abandonment<\/strong> is on by default, and the popup then holds back until the visitor has answered the banner. Accepting and declining both release it, because signing up for an offer is not tracking. On a store with no cookie banner nothing changes at all: the popup opens after its normal delay, exactly as before.<\/p>\n\n<p>It cannot be lost. Whatever happens with the banner, the popup opens no later than 30 seconds after the page loads, and the small floating tab that holds a visitor's own coupon code is never held back.<\/p>\n\n<p>Banners that speak the WordPress Consent API (<strong>Complianz<\/strong>, <strong>CookieYes<\/strong>, <strong>GDPR Cookie Compliance (Moove)<\/strong>, <strong>WPConsent<\/strong>, <strong>Cookiebot<\/strong>, <strong>iubenda<\/strong>, <strong>Beautiful Cookie Consent Banner<\/strong>) need no setup. For a banner that does not, such as <strong>CookieAdmin<\/strong>, <strong>Real Cookie Banner<\/strong> or <strong>Termly<\/strong>, tell the popup when your banner was answered:<\/p>\n\n<pre><code>document.addEventListener('click', function (e) {\n    var answered = e.target.closest('#my-banner-accept') || e.target.closest('#my-banner-reject');\n    if (answered &amp;&amp; window.brikpanel_popup_consent_answered) window.brikpanel_popup_consent_answered();\n}, true);\n<\/code><\/pre><\/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>Newsletter (optional).<\/strong> From a dismissible card on the dashboard, or from the Newsletter row in WooCommerce &gt; Settings &gt; BrikPanel, BrikPanel offers to email you occasionally about new features, WooCommerce tips and ideas for growing your store. Only if you type your email address and tick the consent box is that address sent to our server at brksoft.com, together with your site address, site language and BrikPanel version, so we can add you to the list. Nothing is sent unless you fill in the form and consent, and you can unsubscribe from any email we send. 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 also sell a separate paid product (BrikMentor) on top of BrikPanel, but it is additive, BrikPanel itself stays 100% free.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<p>The full release history of every version is in changelog.txt, included with the plugin. The most recent releases are listed below.<\/p>\n\n<h4>3.3.20 (2026-09-22)<\/h4>\n\n<ul>\n<li>Fix: <strong>The product editor, both product lists and the search box no longer break a store running an older WooCommerce.<\/strong> The GTIN \/ barcode field uses a WooCommerce feature that arrived in WooCommerce 9.2. On anything older the call had nothing to answer it, and the page stopped dead with a critical error instead of simply leaving the field out. That hit the product editor, the WordPress products list, BrikPanel's own products list and any search that matched a product, which between them is most of a working day. The GTIN field now works on older WooCommerce as well, reading and writing the same place WooCommerce itself keeps it, so the barcodes entered there appear by themselves once the store updates WooCommerce, with nothing to move across.<\/li>\n<li>Fix: <strong>Coupons can be created and duplicated on an older WooCommerce again.<\/strong> Saving a new coupon, or duplicating an existing one, called a WooCommerce feature added in WooCommerce 6.2. On an older store both buttons answered with a critical error and nothing was saved. A duplicated coupon is still created as a draft, so a copy never goes live on its own.<\/li>\n<li>Fix: <strong>The Google Sheets order sync no longer fails in the background on an older WooCommerce.<\/strong> The part of the sync that keeps track of which orders are already in the sheet used a WooCommerce class added in WooCommerce 6.9. There was no visible error because the work runs in the background, the sync simply stopped.<\/li>\n<li>Tweak: <strong>The products list draws the GTIN column with one database query instead of one per variation.<\/strong> A variable product with twenty variations used to cost twenty separate product lookups on every page of the list, for a single column.<\/li>\n<li>Change: <strong>BrikPanel now states that it supports WooCommerce 9.2 and later, and says so on stores below that.<\/strong> Nothing is switched off and nothing behaves differently below it. Everything above keeps working on older stores; administrators simply see a dismissible notice recommending a WooCommerce update.<\/li>\n<li>Developer: <code>includes\/brikpanel-wc-compat.php<\/code> is now the single place that wraps any WooCommerce API newer than the oldest supported store, and <code>tools\/wc-floor-audit.php<\/code> fails the build when one is called anywhere else or without a guard. It also treats <code>catch ( \\Exception )<\/code> as no guard at all, because a missing method raises <code>Error<\/code>, which is what made this class of bug reach production three separate times.<\/li>\n<\/ul>\n\n<h4>3.3.19 (2026-09-22)<\/h4>\n\n<ul>\n<li>Change: <strong>The abandoned carts list opens a cart's contents in place, from a small arrow at the start of the row.<\/strong> The \"Details\" button used to sit in the last column, which on a table this wide was usually past the right edge of the screen, so reaching it meant scrolling sideways first. The arrow takes one narrow column and hands the whole actions column back, which is enough to bring another column of data into view. Clicking it slides the cart's items open underneath the row, lined up with the first column, and more than one row can be open at a time.<\/li>\n<li>Fix: <strong>\"Admins only\" now really means administrators.<\/strong> Hiding a top bar control (the hidden-notices bell, the order notifications bell, the search box, any of them) or a sidebar menu item from everyone but administrators had no effect on a store manager whose role had been given the \"manage options\" permission with a role editor, which is a common setup. Those staff accounts kept seeing everything the rule was meant to hide. BrikPanel now checks for the real administrator role, and on a network for a network administrator, exactly as the dashboard widget rules and the settings lock already did. Real administrators and network administrators are unaffected and can never hide a control from themselves. Reported on the support forum.<\/li>\n<li>Tweak: <strong>Abandoned Carts and Customer Analytics now use the full width of the screen.<\/strong> Both pages were held to a narrow centred column, so the Abandoned Carts table never had room for its columns and customer names wrapped onto three and four lines. It was worse after turning BrikMentor on, which adds a Phone and a Follow-ups column to the same narrow space. Both pages now run edge to edge like the Orders, Products and Segments lists, and on a wide screen the table finally fits without scrolling sideways. The search box and the explanatory lines stop growing past a comfortable reading width; everything else lines up with the table so the page reads as one block. Nothing changes on phones or tablets. Reported on the support forum.<\/li>\n<li>Fix: <strong>Dates across BrikPanel now use your store's timezone.<\/strong> They were showing UTC, so on a store set to Istanbul every time was three hours early and any order placed late in the evening was stamped with the previous day. Reported on the support forum for the Segments page, where it was most visible, but the same fault ran through Customer Analytics, the Store Summary report and the daily rows exported to Google Sheets. Segments now matches the WooCommerce orders screen to the minute.<\/li>\n<li>Fix: <strong>Date filters now mean your store's day.<\/strong> Picking \"10 August\", or the Today \/ Last 7 \/ 30 \/ 90 day shortcuts, used to select a London day. On a store three hours ahead that quietly pulled in the last three hours of the previous day and dropped the last three hours of the one you asked for, so the count looked plausible while the rows were wrong. Expect the numbers on these screens to shift a little after updating: they were wrong before.<\/li>\n<li>Fix: <strong>The \"Yesterday\" row of Sales by Period covered 45 hours instead of 24.<\/strong> It started at London midnight of the day before yesterday and ran to your midnight, so it overlapped the Today row and counted some orders twice. Yesterday's revenue will drop after this update, and both rows now add up without double counting.<\/li>\n<li>Fix: <strong>The conversion funnel and cart abandonment rate were measured on two different clocks.<\/strong> Visitor and checkout counts are recorded on your store's day while orders are stored in UTC, and the two windows were not lined up, so the percentages themselves were off rather than just their labels.<\/li>\n<li>Fix: <strong>Best and worst sales times are now your hours, not London's.<\/strong> The day of week table was silently shifted and the peak hour was labelled \"(UTC)\". Both now use the store clock, which is the one you would schedule staff or ads around.<\/li>\n<li>Fix: <strong>The Segments CSV export matches what is on screen.<\/strong> Three of its four date columns carried a raw UTC timestamp and the fourth a formatted date, so a file downloaded after filtering for a given day could contain rows stamped with the day before. Every date column is now your store's time in <code>2026-09-19 14:56<\/code> form, which sorts correctly in Excel, and each heading names the timezone it is using.<\/li>\n<li>Fix: <strong>Monthly tables and customer cohorts are grouped by your months.<\/strong> Orders placed in the first hours of a month were credited to the previous one. Cohort retention is rebuilt once after updating so old and new rows cannot be mixed.<\/li>\n<li>Fix: <strong>Adding an expense just after midnight no longer files it under yesterday.<\/strong> The date box was pre-filled with the London day while expenses are saved against your own day. Existing expenses are untouched.<\/li>\n<li>Fix: <strong>A coupon set to expire on a date now expires at the end of that day in your timezone.<\/strong> It used to survive a few hours into the next day, and the WooCommerce coupon screen showed the wrong expiry date as a result.<\/li>\n<li>Fix: <strong>Twelve month tables no longer skip a month when viewed on the 31st.<\/strong> Stepping back a month from the 31st landed in the same month again, which produced a duplicate column and a missing one on any screen with a monthly axis.<\/li>\n<\/ul>\n\n<h4>3.3.17 (2026-09-21)<\/h4>\n\n<ul>\n<li>Fix: <strong>The order page keeps its two columns on smaller screens.<\/strong> The right column dropped to the bottom of the page as soon as the window went below about 1355px, on a 17 inch laptop with plenty of room left. It now stays beside the items down to roughly a 1200px window, and only moves below once the items would no longer fit as a table. Reported on the support forum.<\/li>\n<li>New: <strong>\"Ad cost per order\" on the dashboard.<\/strong> Open the small arrow on the ROAS card and it divides your ad spend for the selected period by the orders placed in it, so the question \"what did each order cost me in advertising?\" is answered on the same screen as the rest of your numbers. It is tucked behind the arrow so the ROAS card stays exactly the same height as the cards beside it, the way the Revenue and Expenses breakdowns already work. The \"?\" beside it says exactly what is counted: orders placed by store administrators are left out, and on a store using BrikMarket so are marketplace orders, because ad spend drives your own store rather than a marketplace listing. Like ROAS, it shows a dash rather than a misleading figure when your ad account bills in a different currency from the store.<\/li>\n<li>Fix: <strong>A \"?\" explanation on the dashboard is no longer cut off.<\/strong> On a row of six or seven KPI cards the cards clip their contents to keep a long figure inside its column, which also swallowed the little box explaining how a figure is worked out, leaving a sliver of it showing. It now opens over the cards beside it.<\/li>\n<li>New: <strong>A refresh button on the ROAS card pulls today's ad spend on demand.<\/strong> Spend used to arrive once a day, so anyone looking at the dashboard in the afternoon saw a figure from that morning's sync. The small refresh icon in the corner of the ROAS card now fetches the last seven days from every connected ad platform on the spot, and the dashboard updates without a page reload. One person pulling refreshes it for everyone: the button is limited to one pull every ninety seconds across the whole store, so a team all watching the same dashboard cannot hammer the ad platforms. If one platform is unreachable the other still updates and the message says which one failed. Note that Meta and Google both keep revising the current day's figure for hours afterwards, so today's number is the freshest they will give rather than the final one.<\/li>\n<li>Fix: <strong>New ad spend now appears on the dashboard immediately instead of up to ten minutes later.<\/strong> The dashboard keeps its figures in a short-lived cache, and finishing an ad sync did not clear it, so freshly imported spend stayed invisible until the cache expired on its own. It is cleared as soon as spend lands.<\/li>\n<li>Fix: <strong>Switching to a period with no ad spend no longer leaves the previous period's ROAS on the card.<\/strong> Picking a date range without any advertising in it kept the last figure on screen as though it belonged to the new dates. The card now shows a dash, which is the true answer for a period with no spend.<\/li>\n<li>New: <strong>You can choose what the login page says above the sign-in box.<\/strong> It always read \"Welcome back\", in English, with no way to change it. Under WooCommerce \u2192 Settings \u2192 BrikPanel \u2192 Login page there is now a \"Login page heading\" choice: keep the default wording, show your site's name, write your own line, or show nothing at all. Your own line can be up to 100 characters.<\/li>\n<li>Fix: <strong>The login page heading is translatable, and the password and registration screens no longer say \"Welcome back\".<\/strong> The heading was painted by the stylesheet rather than written as text, so no translation could reach it and screen readers could not read it at all. It is now real text, translated into all nine shipped languages, and each screen says what it is for: \"Reset your password\", \"Choose a new password\", \"Create an account\", \"Check your email\".<\/li>\n<li>Fix: <strong>The font and accent colour you pick under Appearance now apply to the login page.<\/strong> They were meant to, and the font was even being downloaded there, but the rule pointed at something that does not exist on the page, so the login screen kept the default typeface and the near-black buttons no matter what you chose. The sign-in button, the field you are typing in, the \"remember me\" tick and the logo tile now all follow your accent colour. Nothing changes if the modern login page is switched off.<\/li>\n<li>Fix: <strong>The login page is laid out right-to-left on Arabic, Hebrew, Persian and Urdu sites.<\/strong> The adjustments for those languages were written but were only ever loaded inside the admin area, never on the login screen itself, so the show-password button and the \"remember me\" tick stayed on the wrong side.<\/li>\n<li>New: <strong>The Login page settings now say where the login logo lives.<\/strong> The logo on the login page has always been the brand logo set under Appearance, but nothing on the Login page screen said so, which made it look like a missing feature. There is now a line pointing at it.<\/li>\n<\/ul>\n\n<h4>3.3.16 (2026-09-20)<\/h4>\n\n<ul>\n<li>Fix: <strong>Google Ads no longer says \"Connected\" when the permission was in fact declined.<\/strong> Google shows the Ads permission as a checkbox that is not ticked in advance, so the connection could finish with it left off: the card reported success and no spend ever arrived, with nothing on screen to explain why. BrikPanel now checks what Google actually granted and, when the Ads permission is missing, says so and asks you to connect again with it ticked. Meta Ads has had the same check since it was added, and nothing about the Meta connection changes.<\/li>\n<li>Tweak: <strong>The Google Ads card now explains Google's permission screen instead of contradicting it.<\/strong> The card promised \"read-only access\" while Google asked for \"See, edit, create, and delete your Google Ads accounts and data\", which looked like BrikPanel asking for far more than it admitted. It was not: the Google Ads API has exactly one permission and no read-only version, so there is nothing narrower to request, and BrikPanel still only reads daily spend, impressions and clicks and never creates, edits or deletes anything in your account. The card says that plainly, and for anyone who wants the permission itself narrowed it names the way to do it: connect with a Google account that has Read-only access to the Ads account.<\/li>\n<li>Fix: <strong>Hiding columns in the order list through Screen Options works properly again.<\/strong> Turning off the \"Order\" column left the compact list unusable: the arrow that opens the order details sat in a hidden cell, so the panel could not be opened at all, and several columns at once were pinned to the left edge with a white background that cut across the row lines and the hover highlight. The arrow now moves to the Customer column, or the first column still visible; nothing is pinned when there is nothing to pin; the phone layout follows the columns you hide; and the \"No items found\" row spans the columns actually on screen. Hiding Payment method or Shipping was already safe, and both stay in the order panel as a \"via ...\" line.<\/li>\n<\/ul>\n\n<h4>3.3.15 (2026-09-19)<\/h4>\n\n<ul>\n<li>Fix: <strong>The changelog on the WordPress.org plugin page is complete again.<\/strong> The release history had grown longer than WordPress.org accepts, so the page cut it off part way through and the newest entries were the only ones anybody could read in full. The page now carries the most recent releases, and the complete history of every version ships with the plugin in <code>changelog.txt<\/code>.<\/li>\n<\/ul>\n\n<h4>3.3.14 (2026-09-19)<\/h4>\n\n<ul>\n<li>New: <strong>Invoice, shipping label and tracking boxes are back in the right column of the order page.<\/strong> Since the order page moved to tabs, every box another plugin adds went under \"More\", so printing an invoice or entering a tracking number cost a click on every single order. BrikPanel now recognises more than forty boxes from the widely used invoice, packing slip, courier and payment plugins and opens them in the narrow right column, where they were before. The test a box has to pass is whether you do something with it on the order, so a box that only reports something stays under \"More\". Everything it does not recognise stays under \"More\" exactly as now, and the \"More\" tab disappears when nothing is left in it. Screen Options has a new \"Show in the sidebar\" list: tick any box to move it to the right column, untick one to send it back, with a \"Reset to defaults\" link. The choice is saved per person, so each member of staff can arrange the screen their own way. Developers can add their own box with the new <code>brikpanel_order_sidebar_boxes<\/code> filter.<\/li>\n<li>Fix: <strong>Google Ads, Meta Ads and Google Sheets connections no longer disconnect themselves.<\/strong> A connection could vanish seconds after it was made, and the log blamed a \"corrupted\" stored credential that was in fact perfectly intact. The cause was the site address: WordPress reports it as <code>https<\/code> or <code>http<\/code> depending on how each individual request arrived, and BrikPanel locked its stored credentials to that value \u2014 so a connection made in your browser over HTTPS could not be read by the scheduled task that ran moments later, and BrikPanel deleted it. It took both ad platforms at once, because they share one stored record. Credentials are now locked to the site's own security keys instead, which do not change between requests, and <strong>nothing is ever deleted because it could not be read<\/strong>: existing connections are upgraded automatically the first time they are opened, and a credential that genuinely cannot be read is kept and reported rather than thrown away.<\/li>\n<li>Fix: <strong>A connection you have just re-made is no longer deleted by a renewal already in progress.<\/strong> A background renewal that was still using the previous credential could get a rejection back from Meta and act on it, removing the connection you had created seconds earlier. The renewal now checks that the credential it was rejected for is still the stored one.<\/li>\n<li>Fix: <strong>A background renewal no longer reverts the ad account you just picked.<\/strong> Choosing a different ad account while a scheduled sync was running could silently put the old choice back.<\/li>\n<li>Fix: <strong>The Ad Platforms and Google Sheets cards now say when stored credentials cannot be read<\/strong>, instead of simply showing \"Not connected\" with no explanation, and name the usual causes: a changed site address, a move to a new server, or new security keys in wp-config.php.<\/li>\n<\/ul>\n\n<h4>3.3.13 (2026-09-18)<\/h4>\n\n<ul>\n<li>New: <strong>The signup popup waits for your cookie banner.<\/strong> On a store with a cookie banner, visitors used to meet two things at once: the banner and, seconds later, the signup popup on top of it. The popup now holds back until the visitor has answered the banner, and accepting or declining both release it, because signing up for an offer is not tracking. Nothing changes on a store without a banner, the floating coupon tab is never held back, and the popup opens after 30 seconds whatever the banner does, so no signup can be lost. Turn it off under WooCommerce \u2192 Settings \u2192 BrikPanel \u2192 Cart abandonment \u2192 \"Wait for cookie banner\".<\/li>\n<li>Fix: <strong>Orders renumbered by a sequential order number plugin now show that number everywhere, not just in the orders list.<\/strong> Opening an order showed WooCommerce's internal ID in the header instead of the number the list had just shown. The dashboard's recent orders, the Segments table, the recovered-order link on Abandoned Carts and the status-change bar on the orders list had the same problem.<\/li>\n<li>Fix: <strong>Cmd\/Ctrl + K finds an order by phone number however it was typed.<\/strong> A number kept as \"+44 7911 123456\" was not found by typing \"07911 123456\", or the other way round. Spaces, dashes, brackets and a leading 0 or 00 no longer matter, and the last digits of a number are enough to find it. Names now match inside a word and across spellings, so \"yilmaz\" finds \"Y\u0131lmaz\", and an exact name comes before a partial one. Trashed and draft orders no longer take up result slots, an order that matches twice is listed once, the closest match is first again, and a search beginning with \"-\" no longer fails. On a store with 700,000 orders a search by customer name went from 761 ms to 1 ms.<\/li>\n<li>Dev: <strong>New filters <code>brikpanel_search_terms<\/code><\/strong> (add your own spellings of what was typed) <strong>and <code>brikpanel_search_order_ids<\/code><\/strong> (add or drop the orders the palette found), and <strong><code>window.brikpanel_popup_consent_answered()<\/code><\/strong>, which tells the signup popup that a banner not speaking the WordPress Consent API has been answered. All three are documented on the Developer page.<\/li>\n<\/ul>\n\n<h4>3.3.12 (2026-09-17)<\/h4>\n\n<ul>\n<li>Fix: <strong>The order total is back in front of the columns other plugins add.<\/strong> With the compact order list, a column you keep in the row through Screen Options (\"Show in the row\"), such as a profit or tracking number column, was placed ahead of Total, so the amount ended up at the far right of the row. Total now sits right after Shipping, where WooCommerce has always put it, and those columns follow it. Nothing changes for stores that keep no extra column in the row.<\/li>\n<li>New: <strong>One button cleans bot traffic out of your figures, with undo.<\/strong> The Store Health check \"Bot Traffic\" replaces \"Add-to-Cart History\" and now covers everything a scripted crawl can inflate: daily visitors, product views, page views, traffic sources, device counts, store and per-product add-to-carts, checkout visits, and the abandoned-cart entries the \"Abandoned Cart Entries\" check rates as certainly scripted. One click lowers each flagged day to the highest figure it could honestly have had and deletes the scripted entries. Everything it changes is kept in a restore point that never expires on its own, so \"Undo last correction\" puts it all back whenever you want. A restore point left by the old check is replayed by the same undo.<\/li>\n<li>Tweak: <strong>Store Health (BrikControl) is on by default again.<\/strong> New installs start with it enabled, the same as stores that installed BrikPanel earlier. Turn it off under WooCommerce \u2192 Settings \u2192 BrikPanel \u2192 Store Health if you do not want it.<\/li>\n<li>Tweak: <strong>The red \"critical store health issue\" banner on the dashboard is gone.<\/strong> Store Health findings now show only on the topbar shield and the Store Health page.<\/li>\n<li>Fix: <strong>Visitor, product-view and Live figures are no longer inflated by scripted browsers.<\/strong> The \"one visitor, once a day\" rule lived only in the browser's own storage, so a crawler that runs the page but starts every visit with a blank profile was counted as a new visitor on every page it opened, and every one of its pings became a new entry in the Live view; one store with under a hundred real visitors a day showed eleven thousand and forty people live at once. The rule is now also kept on the server, the same way the add-to-cart and checkout counters have been since 3.3.1: a browser with no memory of the store gets one visitor count and one product-view count per day and at most one Live entry at a time. Returning browsers and signed-in customers are unaffected, and browsers that declare themselves automated are not counted at all. Figures already recorded are left as they are.<\/li>\n<\/ul>\n\n<h4>3.3.11 (2026-09-17)<\/h4>\n\n<ul>\n<li>Fix: <strong>Attributes page on phones no longer overlaps the column names and their values on right-to-left languages<\/strong> (Persian, Arabic, Hebrew). The same applied to the expand arrow in the tag and category tables.<\/li>\n<\/ul>\n\n<h4>3.3.10 (2026-09-17)<\/h4>\n\n<ul>\n<li>Fix: <strong>Other plugins' product fields now work in the automatic mode of \"Additional product data\".<\/strong> When that card was switched on with \"Show these fields\" on a store with no SEO card and no hand-picked box, the scripts of the plugins behind those fields were never loaded, so their controls did nothing. Measurement Price Calculator showed every calculator section at once instead of only the selected one; it now behaves like the native WooCommerce screen, including the per-unit price label (\"$ \/ sq cm\") on right-to-left stores.<\/li>\n<li>Fix: <strong>The \"Ship to\" box in the order list no longer repeats the customer's name.<\/strong> Some shipping plugins (for example AgenWebsite Shipping) add the phone number to the name line of the address, such as \"Jane Doe (Phone: +62...)\". The expanded order panel did not recognise that as the name line and printed it again inside the address. It now shows the name once, then the phone, then the address.<\/li>\n<li>Fix: <strong>Three PHP 8.4 deprecation notices removed<\/strong> (Store Health and Google Sheets order sync used an older way of writing an optional parameter).<\/li>\n<\/ul>\n\n<h4>3.3.9 (2026-09-16)<\/h4>\n\n<ul>\n<li>New: <strong>A switch to hide every BrikMentor promotion.<\/strong> WooCommerce \u2192 Settings \u2192 BrikPanel \u2192 General \u2192 \"Show BrikMentor promotion\". Turn it off and the dashboard card, the menu item, the corner button, the launch notice and the padlocked contact buttons on Abandoned Carts all go, and the screen is what it was before. Agencies can pin it for every client store with <code>define( 'BRIKPANEL_BRIKMENTOR_PROMO', false );<\/code> in wp-config.php. The setting travels with Import \/ Export.<\/li>\n<\/ul>\n\n<h4>3.3.8 (2026-09-16)<\/h4>\n\n<ul>\n<li>New: <strong>BrikMentor in the left menu.<\/strong> A \"BrikMentor \u00b7 New\" item sits under Marketing and opens a short page: your own store's numbers, the offer, the eight ready flows (abandoned cart, win-back, post-purchase, back in stock and more) and what you do not need to set up. It only shows while BrikMentor is not installed, and you can hide it from Settings \u2192 Navigation.<\/li>\n<li>New: <strong>Dashboard card with your own numbers.<\/strong> Under the KPI cards, a card shows how much was left in abandoned carts over the last 30 days. It only appears when there are abandoned carts, and the X hides it for 30 days.<\/li>\n<li>New: <strong>Customer Analytics card.<\/strong> Between the title and the tabs, a card shows how many customers are drifting away (At Risk, Can't Lose Them and Hibernating segments). It is hidden when there are none, and shares the 30 day dismiss with the dashboard card.<\/li>\n<li>New: <strong>\"Recover these carts on autopilot\" link<\/strong> under the abandoned value card on the Abandoned Carts screen.<\/li>\n<li>Tweak: <strong>The BrikMentor star in the corner no longer moves.<\/strong> It still grows slightly on hover.<\/li>\n<li>Tweak: <strong>Store Health (BrikControl) starts turned off on new installs.<\/strong> Stores that already use BrikPanel keep their current setting. Turn it on any time under WooCommerce \u2192 Settings \u2192 BrikPanel \u2192 Store Health.<\/li>\n<li>Fix: <strong>New menu items now show up in a customized menu.<\/strong> If you had customized the menu under Settings \u2192 Navigation, a new BrikPanel store screen was added to the end of the closed site management group, where you could not see it. It now lands at the end of the store section.<\/li>\n<li>Fix: <strong>A stray \"New Porto Builder\" form no longer shows at the bottom of BrikPanel screens<\/strong> when the Porto theme is active.<\/li>\n<li>Dev: <strong>New filters <code>brikpanel_nav_new_item_after<\/code><\/strong> (place a new menu item after a given store item) <strong>and <code>brikpanel_nav_item_title<\/code><\/strong> (change a menu item's title when it is drawn).<\/li>\n<li>Tweak: <strong>Tested with WordPress 7.1.<\/strong><\/li>\n<\/ul>\n\n<h4>3.3.7 (2026-09-16)<\/h4>\n\n<ul>\n<li>New: <strong>Keep any column in the order row.<\/strong> With the compact order list, columns from other plugins (such as Profit, Tracking Number or Invoice) and WooCommerce's Actions only showed under the order. Screen Options now has a \"Show in the row\" group: tick a column and it stays in the row. The choice is saved per user, and nothing changes until you tick one.<\/li>\n<li>Fix: <strong>Buttons from other plugins work in the order details panel,<\/strong> a column hidden in Screen Options no longer shows there, and column names with capital letters are remembered.<\/li>\n<li>Fix: <strong>Measurement Price Calculator works in the product editor.<\/strong> Its options no longer stack, the unit price shows in the price box, and the Pricing Table, Area and Volume settings, calculator settings and variation minimum price, area and volume are no longer lost on save. Yoast WooCommerce SEO no longer moves the calculator card into the SEO box.<\/li>\n<li>Fix: <strong>Multi-currency (CURCY) prices on the product page.<\/strong> The extra currency fields show once, variation and sale prices in the extra currency are saved, and opening a product no longer counts as an unsaved change, which made published products autosave every minute.<\/li>\n<\/ul>\n\n<p>Older releases (3.3.6 and earlier) are listed in changelog.txt, included with the plugin.<\/p>","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:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/226093","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=226093"}],"author":[{"embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/brksoft"}],"wp:attachment":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=226093"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=226093"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=226093"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=226093"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=226093"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=226093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}