Custom Reports & Dashboards
Custom Reports is the page where you ask a question the eleven canned reports don’t answer. Pick a domain, filter it, group it, aggregate it, save it. Pivot the result. Drop the result into a dashboard alongside other queries. Four tabs, one underlying query engine.
The four tabs
- Templates — a gallery of pre-built reports. Pick one to start from a known shape (e.g. Top 20 customers by revenue this quarter, Slow-moving inventory, Refund rate by cashier) instead of from a blank canvas.
- Query Builder — the structured editor: pick a domain, add filter conditions, choose grouping fields, choose aggregations, run.
- Pivot Table — drag-and-drop rows / columns / values. Useful for cross-tab analysis (“revenue by category × month”).
- Dashboards — compose multiple saved queries into one tile-grid view, refreshable on demand.
Building a query
Pick a domain
Sales, Inventory, Expenses, Customers, Suppliers, Delegates. Each domain maps to one or more underlying tables; the field list narrows to what’s available in that domain.
Add filter conditions
Each row is field operator value. Operators include =, !=, >, <, >=, <=, contains, between, in. Combine with AND / OR. Use the date picker for time fields — the picker honours the tenant’s business-day-start hour, so “today” matches the rest of the reporting suite.
Choose grouping fields
Optional. One or more fields to GROUP BY. With no grouping, you get the raw row list; with grouping, the result collapses to one row per group.
Choose aggregations
When grouping, pick the value fields and how to roll them up: sum, count, avg, min, max. The classic shape is group by customer, sum invoice total → top customers by revenue.
Run and save
The result drops into a sortable, exportable table below the editor. Save stores the query under a name; saved queries surface in the Templates tab and become available as Dashboard widgets.
Pivot Table tab
Dashboards
A dashboard is a layout of saved-query tiles. Add tiles, resize them, give the dashboard a title. Each tile renders its query’s result as a number, a chart, or a small table — the choice is per-tile.
Dashboards aren’t live-streaming; refresh runs the queries and re-renders. That’s deliberate — running every dashboard query on every page open would hammer the database for a screen that mostly sits idle.
The data domains in detail
- Sales — invoices, invoice items, payments, refunds. Fields: invoice date, customer, total, paid, owed, items count, payment method, delegate, cashier.
- Inventory — products, variants, stock counts, ingress / egress audit rows. Fields: product name, SKU, category, current quantity, FIFO unit cost, total value, last-restocked date, last-sold date.
- Expenses — expense rows + amortised prepaid recognitions. Fields: date, category, amount, paid-by user, attachment count.
- Customers — customer records + invoice rollups. Fields: name, phone, total spend, invoice count, AR balance, store-credit balance, last purchase date.
- Suppliers — supplier records + PO rollups. Fields: name, total purchases, AP balance, last PO date.
- Delegates — delegate records + commission accruals. Fields: name, sales volume, commission rate, accrued commission, paid commission.
Permissions
Custom Reports is gated behind the reports:view permission like the rest of the Reports section. Saved queries and dashboards are tenant-scoped — every user with the permission sees the same library, so naming hygiene matters when you’re working multi-cashier.