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.
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
- Expenses must already be recorded (via the Expenses page) for any data to appear — this is a read-only reporting page.
- Requires the Advanced plan tier or above and a role with Reports/Export permission to see totals and use Export; the underlying feature key is
expense_tracking.
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.
- Set the From/To date range (or click This Month / Last Month / This Year) and click Refresh.
- Read the four summary cards: Total Expenses, No. of Entries, Average Expense (per entry), and Cash Expenses (vs other payment modes).
- 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.
- Check the Monthly Expense Trend bar chart for a period-over-period view.
- Scroll the All Expenses table — Date, Description, Category (colour-coded badge), Paid To, Mode, Amount — with a Total row at the bottom.
- 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.
- Set the date range and click Refresh.
- Read the three summary cards: Total Expenses, Total Entries, Categories Used.
- Check the Category Distribution pie chart and the ranked list beside it (each with its % share).
- 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".
- 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.
- Read the Grand Total row at the bottom of the accordion.
- 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.
- Set the date range and click Refresh.
- Read the four summary cards: Total Expenses, Total Entries, Unique Items, Unique Payees.
- 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.
- In By Item view, check the Monthly Expense Trend by Item stacked bar chart (top 5 items + Others).
- 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.
- 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 / Button | What it does |
|---|---|
Period date pickers + This Month/Last Month/This Year | Shared date-range control on every tab; changing it does not auto-refresh — click Refresh to reload. |
Refresh | Re-fetches the current tab's data for the selected date range. |
Category badge | Colour 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 column | Each row's amount as a percentage of the total for the currently filtered period, shown with a mini progress bar. |
Export | Downloads a CSV/Excel matching the active tab and, on the Item tab, the active By Item/By Payee view. |
Tips & Best Practices
- Use By Category first to spot which expense category is growing fastest, then switch to By Item on that category's period to find the specific line items driving it.
- The Payee view is useful for finding all payments made to one vendor across different categories — helpful when reconciling a supplier's statement.
- Bookmark a tab's URL with its
?tab=parameter (e.g..../expense-reports?tab=category) to jump straight to that view next time.
Troubleshooting & FAQ
The tab I want is not the one that opens by default.
?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.
Export button is missing.
Numbers on this page do not match what I entered on the Expenses page.
🧑💻 Developer Notes
Source component(s):
frontend-app/packages/pos-react-lib/src/pages/ExpenseReports.jsx
Backend endpoints used:
GET /reports/expenseGET /reports/expense/categoryGET /reports/expense/item
Related tables (db-core repositories):
ExpenseExpenseCategory
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.