Home / Help Center / pos-app / Reports / Expense Reports
💸 Reports

Expense Reports

Expense Reports gives you three views of the same expense data — a full ledger, a category breakdown, and an item/payee analysis — so you can see not just how much you spent but where it went.

📍 Menu path: Reports → Expense Reports (All Expenses / By Category / By Item)
👤 Who uses it: Admin, Owner/Accountant with Reports/Export permission
🏷️ Plan tier: advanced+

Overview

Expense Reports has three tabs, switchable both by clicking and via the URL's ?tab= query parameter: All Expenses (?tab=expense), By Category (?tab=category), and By Item (?tab=item).

Every tab shares the same date-range picker with quick presets (This Month, Last Month, This Year) and independently loads its own data for that range, so switching tabs does not clear or reload another tab's state.

Charts (pie for payment mode/category split, bar for monthly trend) sit above the detail table on each tab, and each tab has its own Export button that matches its current view.

Before You Start

Step-by-Step Guide

1 All Expenses — read the full ledger

This is the ?tab=expense view and is the default tab when the page opens.

  1. Set the From/To date range (or click This Month / Last Month / This Year) and click Refresh.
  2. Read the four summary cards: Total Expenses, No. of Entries, Average Expense (per entry), and Cash Expenses (vs other payment modes).
  3. Check the Expenses by Payment Mode donut chart and the per-mode amount tiles below it to see your Cash/Bank/UPI/Card/Other split.
  4. Check the Monthly Expense Trend bar chart for a period-over-period view.
  5. Scroll the All Expenses table — Date, Description, Category (colour-coded badge), Paid To, Mode, Amount — with a Total row at the bottom.
  6. Click Export to download the ledger as CSV/Excel with Date, Description, Category, Paid To, Reference, Payment Mode, Amount and Notes columns.

2 By Category — see where the money is going

This is the ?tab=category view.

  1. Set the date range and click Refresh.
  2. Read the three summary cards: Total Expenses, Total Entries, Categories Used.
  3. Check the Category Distribution pie chart and the ranked list beside it (each with its % share).
  4. Check the Monthly Trend by Category stacked bar chart — it shows your top 5 categories as separate stacked segments, with everything else grouped into "Others".
  5. Click any category row in the Category-wise Breakdown accordion to expand it and see every individual expense inside that category (Date, Description, Paid To, Mode, Amount); click again to collapse.
  6. Read the Grand Total row at the bottom of the accordion.
  7. Click Export for a category-level summary CSV (Category, Entries, Amount, % of Total).

3 By Item — analyse by description or payee

This is the ?tab=item view.

  1. Set the date range and click Refresh.
  2. Read the four summary cards: Total Expenses, Total Entries, Unique Items, Unique Payees.
  3. Use the By Item / By Payee toggle in the table header to switch the grouping: By Item groups by expense description; By Payee groups by who was paid.
  4. In By Item view, check the Monthly Expense Trend by Item stacked bar chart (top 5 items + Others).
  5. Scroll the ranked table — By Item shows Item/Description, Count, Last Occurrence date, % Share and Total Amount; By Payee shows Payee/Vendor, Payments, Categories (chips, capped at 2 + "+N more"), % Share and Total Amount.
  6. Click Export — the columns and filename adapt automatically to whichever of the two views (item or payee) is currently selected.

Every Field & Button, Explained

Field / ButtonWhat it does
Period date pickers + This Month/Last Month/This YearShared date-range control on every tab; changing it does not auto-refresh — click Refresh to reload.
RefreshRe-fetches the current tab's data for the selected date range.
Category badgeColour comes from the category's own configured colour, set on the Expense Categories master data.
By Item / By Payee toggle (Item tab only)Switches the grouping dimension without changing the date range.
% Share columnEach row's amount as a percentage of the total for the currently filtered period, shown with a mini progress bar.
ExportDownloads a CSV/Excel matching the active tab and, on the Item tab, the active By Item/By Payee view.

Tips & Best Practices

Troubleshooting & FAQ

The tab I want is not the one that opens by default.
Add ?tab=category or ?tab=item to the URL, or simply click the tab you want — the page reads the tab from the URL on load but you can always switch by clicking.
A category shows no expenses when I expand it.
The accordion only expands categories that have at least one expense within your selected date range; widen the date range if you expect data.
Export button is missing.
Export requires Reports/Export permission — ask your Admin to grant it under Settings → Staff Permissions.
Numbers on this page do not match what I entered on the Expenses page.
This report is scoped to the store/branch currently selected in the top scope selector, and to the exact date range chosen here — check both before comparing totals.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/packages/pos-react-lib/src/pages/ExpenseReports.jsx

Backend endpoints used:

  • GET /reports/expense
  • GET /reports/expense/category
  • GET /reports/expense/item

Related tables (db-core repositories):

  • Expense
  • ExpenseCategory

Redux slices:

  • scope (selectCurrentScope / getScopeQueryParams)

Feature flag key: expense_tracking (requires advanced plan tier or above)

Each of the three tabs (ExpenseTab, ExpenseByCategoryTab, ExpenseByItemTab) is its own sub-component with independent from/to state and its own data fetch; switching tabs does not refetch the tab you are leaving. The active tab is synced to the router via useSearchParams so the URL always reflects tab=expense|category|item.