A custom WC admin you actually want to use
WooCommerceDefault WooCommerce admin slows down past 10,000 orders, and the metrics your team checks every morning are buried three clicks deep. Here's what we build instead: a focused store dashboard on top of the WC REST API. Click any sidebar item to see it work.
// GET /wp-json/wc-analytics/reports/revenue/stats?period=month { "totals": { "net_revenue": 12480.00, "gross_sales": 13950.00, "orders_count": 88, "num_items_sold": 156, "coupons": 220.00, "refunds": 640.00 }, "intervals": [ { "interval": "day-1", "date": "2026-04-01", "net_revenue": 412.00 }, { "interval": "day-2", "date": "2026-04-02", "net_revenue": 380.50 }, { "interval": "day-3", "date": "2026-04-03", "net_revenue": 295.00 }, // ... 27 more days { "interval": "day-30", "date": "2026-04-30", "net_revenue": 504.00 } ] }
// One endpoint, one round-trip, all dashboard data. // Uses wc_order_stats lookup table for speed at scale. add_action('rest_api_init', function () { register_rest_route('bineks/v1', '/dashboard', [ 'methods' => 'GET', 'callback' => 'bineks_dashboard_payload', 'permission_callback' => fn() => current_user_can('manage_woocommerce'), ]); });
View source
function bineks_dashboard_payload(WP_REST_Request $req) {
$period = $req->get_param('period') ?? '1M';
return [
'revenue' => bineks_revenue_stats($period),
'orders_today' => bineks_orders_today(),
'latest_sale' => bineks_latest_sale(),
'top_seller' => bineks_top_seller($period),
'low_stock' => bineks_low_stock(threshold: 5),
'new_customers' => bineks_customers_today(),
'refunds' => bineks_pending_refunds(),
];
}
function bineks_revenue_stats($period) {
global $wpdb;
$bounds = bineks_period_bounds($period);
return $wpdb->get_row($wpdb->prepare("
SELECT SUM(net_total) AS net_revenue,
SUM(num_items_sold) AS items,
COUNT(*) AS orders
FROM {$wpdb->prefix}wc_order_stats
WHERE status IN ('wc-completed', 'wc-processing')
AND date_created BETWEEN %s AND %s
", $bounds['from'], $bounds['to']));
}