Skip to main content

Categories dashboard

Category and menu performance: revenue share, penetration, per-category drill-down with channel and timeframe splits, plus five time-scale views.

Written by HB

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)

Revenue by Menu and 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)

Revenue by Menu and Category bar

The same data as the pie but as a bar chart — easier to compare exact magnitudes.

3. Category performance

Category performance table

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

Quantity by Channel pie

For the filtered category: how many units sold through each channel.

2. Revenue | by Channel type

Revenue by Channel pie

The same lens, by revenue.

3. Quantity & revenue | by Timeframe

Quantity and 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

Top items in 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

Bottom items in category

The worst-selling items in the filtered category. Candidates for the chop.


Weekly tab

1. Revenue | Weekly by category

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

Revenue Monthly by category

Same chart, grouped by calendar month.


Yearly tab

1. Revenue | Yearly by category

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

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

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 fieldreportingDate for time buckets. The timeframe attribution uses orderDate for 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.

Did this answer your question?