What this dashboard is for
The Categories dashboard groups your menu items into menus and categories (the structural layers above an item) and shows how each category is performing.
Open it when you are looking at the menu architecture rather than individual dishes — "is the Pasta section pulling its weight?", "are starters losing ground to mains?", "which menu drives the most revenue at dinner time?"
The menu-category hierarchy
Papaya organises items in two layers:
Menu — the top level (Food, Drinks, Bakery, Lunch Set, etc.). An outlet can have many menus.
Category — the section within a menu (Burgers, Pasta, Cocktails, Coffee, etc.).
Every chart in this dashboard joins from order_items.menuItemCategoryId through the categories table to find the parent menu. Both the new (categories_v2, menus_v2) and legacy (categories, menus) tables are union-ed so historical data is covered.
The seven tabs
Overall — pie + bar of revenue by menu+category, plus a performance table.
Per Category Snapshot — pick a menu and a category from the click-to-filter tables at the top; the four charts below scope to that selection.
Weekly / Monthly / Yearly / Daily / Weekday — same chart (Revenue by category) at five different time scales. Each has the menu and category pickers at the top.
The click-to-filter picker pattern: at the top of every tab there are one or two small tables. Click a row to apply that menu or category as a filter to the rest of the tab. Click again to clear.
Overall tab
1. Revenue | by Menu & Category (pie)
A pie chart showing revenue split across every menu+category combination in the range. The outer ring is the categories; the legend groups them by their parent menu.
How it's calculated: sum of order_items.itemTotal on confirmed items in closed orders, joined to categories then to menus. Items without a category fall under "(no category)".
2. Revenue | by Menu & Category (bar)
The same data as the pie but as a bar chart — easier to compare exact magnitudes.
3. Category performance
A wide table with one row per menu+category. The columns:
Revenue — total revenue from that category.
% of total — that category's share of overall revenue.
Orders containing it — number of distinct cheques that included at least one item from that category.
Order penetration % — orders-containing-it ÷ total orders. How frequently this category appears on a cheque.
Items sold — total units sold from the category.
Reading it: a category with high revenue but low penetration is a high-ticket niche (a few people buy big). High penetration but low revenue is a low-priced staple (everyone buys but it's cheap). The combination tells you what role each category plays.
Per Category Snapshot tab
This tab starts with two picker tables side by side (a menu picker on the left, a category picker on the right). Click into the menu first, then the category, to drill the rest of the tab into one slice of the menu. The screenshots below show the unfiltered (all categories) view.
1. Quantity | by Channel type
For the filtered category: how many units sold through each channel.
2. Revenue | by Channel type
The same lens, by revenue.
3. Quantity & revenue | by Timeframe
For the filtered category: quantity and revenue split across your configured timeframes (Breakfast, Lunch, Dinner, etc.).
How it's calculated: each order is matched to the timeframe whose start/end clock window contains its orderDate in Bangkok time. Overnight timeframes (22:00 → 02:00) are handled. Orders that don't fall inside any configured timeframe (or where no timeframes are configured) appear under "(unmatched / no timeframes set)".
4. Top items in this category
Items in the filtered category, ranked by quantity, with revenue, orders containing the item, and items-per-order alongside.
5. Bottom items in this category
The worst-selling items in the filtered category. Candidates for the chop.
Weekly tab
1. Revenue | Weekly by category
Stacked bars: one bar per week (Monday-to-Sunday in Bangkok time), each segment a category. Use the menu and category pickers at the top of the tab to drill in.
Monthly tab
1. Revenue | Monthly by category
Same chart, grouped by calendar month.
Yearly tab
1. Revenue | Yearly by category
One bar per calendar year. Most useful for outlets with multiple years of data.
Daily tab
1. Revenue | Daily by category
One bar per business day. Good for spotting an outlier — a private event, a category-specific stockout, a promo day.
Weekday tab
1. Revenue | Weekday by category
Each weekday's average revenue, split by category. Mondays through Sundays across the bottom; one segment per category in each bar.
Reading it: the natural mix of your week. A category that's huge on Saturdays but tiny on weekdays may need different staffing or prep on weekends.
How categories are defined
Source — categories come from the merchant's menu configuration, joined via
order_items.menuItemCategoryId. Both new (categories_v2/menus_v2) and legacy (categories/menus) tables are union-ed.Status filters — closed orders only (
orders.status = 'complete') and confirmed items only (order_items.status = 'confirmed').Date field —
reportingDatefor time buckets. The timeframe attribution usesorderDatefor time-of-day matching.Timezone — Asia/Bangkok.
Uncategorised items — items whose category lookup returns nothing show under "(no category)" / "(no menu)". This happens in two ways: open items typed in at the POS that were never assigned to a menu or category, or items whose menu/category was later deleted. The dashboard itself carries the same note at the bottom of each tab.
Filters
Reporting Date — the date range.
Outlet — pinned to your outlet in the merchant portal.
Menu — click a row in the menu picker at the top of the tab.
Category — click a row in the category picker.
What this dashboard does NOT show
Individual item performance — that's the Items dashboard.
Category margin / COGS — see the Inventory module.
Channel performance independent of category — see Channels.
Overall historical revenue / orders / AOV — see Trends.













