Skip to content

Reports

The financial statements — trial balance, P&L, balance sheet, cash flow, general ledger, day book, budget vs actual and expenses by category — read from posted (and reversed) journal movement, so a draft document can never inflate a figure and they cannot disagree with the ledger they summarize. The aging, sales-analysis and stock reports read the documents and item records directly; the stock valuation report shows its difference against the inventory accounts on purpose, so you can see when the two have drifted apart. Reports refresh immediately after any GL-affecting write.

  • Trial balance — every account’s balance in debit/credit columns; totals tie when the ledger is balanced. Can be filtered by accounting dimension (journal movement only, since opening balances are not dimension-attributable).
  • Profit & loss — revenue and expense movement over a date range, netted to a net-profit figure, with optional dimension filters. Supports comparative periods.
  • Balance sheet — assets, liabilities and equity as of a date, with a synthetic retained-earnings line folding in the cumulative P&L. Supports a comparative as-of date.
  • General ledger — transactions per account with a running balance, preceded by the opening balance carried into the window; filterable by account and contact.
  • Day book — every journal line in the order things happened, filterable by source type.
  • Cash flow — opening and closing cash with the movements that drove it, classified by each account’s cash-flow category. Supports comparative periods.
  • Budget vs actual — one budget’s account × period grid beside the actual journal movement for the same periods, with a variance per line, per account and in total. Actuals are signed in normal-balance terms, so revenue and expense budgets both read as positive numbers, and a period that has not started yet keeps its budget and reports a zero actual.
  • AR aging and AP aging — open documents bucketed by days past due (current, 1–30, 31–60, 61–90, over 90). Support a comparative as-of date.
  • Sales by item — quantity, revenue, cost and gross margin per item.
  • Sales by customer — invoice count, revenue and outstanding per customer.
  • Expenses by category — expense totals per account.
  • Tax summary — net tax payable (output minus input) from the ledger, with taxable value per rate from the documents.
  • GSTR-1 and GSTR-3B — India GST return views.
  • Stock valuation and stock reorder — on-hand value and reorder positions for tracked items.

Several reports can put a second period beside the first, and the comparison is always additive — ask for it and the extra figures appear, leave it out and the report is exactly what it was.

  • Profit & loss — a second date window adds a previous amount, variance and % change to every account row, every section total and the net-profit line.
  • Balance sheet — a second as-of date adds a previous balance, variance and % change per account, and a previous total per section; each section’s own variance and % change are computed for the screen and the CSV.
  • Cash flow — a second date window returns that window’s opening and closing cash, plus a previous total, variance and % change for each section (operating, investing, financing and unclassified) and for the net change.
  • AR aging and AP aging — a second as-of date re-buckets the same open documents against that earlier date and returns a previous figure, variance and % change per bucket, so you can see which bucket a balance has aged into. This is not a historical snapshot: both sides age today’s open balances, so the overall total is identical on both and its variance is always zero.

A half-comparison is refused: for the window-based reports, both ends of the comparison window go together or neither does.

One endpoint computes the whole KPI home, and every figure on it is an aggregate of a report on this page — receivables and payables are the AR/AP aging totals, cash is the banking module’s own balance formula, income and expense are the P&L — so the dashboard cannot disagree with the report it links to. The response carries a generated_at stamp, which the screen shows as a “last updated” time.

What it returns:

  • Receivables and payables — the open total, the past-due portion, the not-yet-due remainder, the full aging buckets (current, 1–30, 31–60, 61–90, over 90) and a count of past-due documents. Overdue is total minus current, measured against the same as-of date the aging report uses, so the card and the report describe the same documents.
  • Cash and bank — a combined figure plus a per-account breakdown. Foreign accounts are converted for the total (see Multi-currency).
  • Income vs expense for the chosen window, netted. Ask for a comparison window and the block additively gains the previous period’s income, expense and net, plus a variance and % change for each. When the previous figure is zero the percentage comes back empty rather than fabricated.
  • A 12-month revenue/expense trend — the twelve whole calendar months ending with the selected window’s month, with income, expense and net for each. Months with no posted movement are zero-filled: a quiet month charts as a real zero rather than a gap that reads as missing data.
  • Alerts — how many invoices and how many bills are past due, and how much money that is; the amounts are the same overdue figures as the cards above.

The app home and the Financial Overview page under Reports both read this endpoint. The app home picks a period — this month, last month, this quarter, this financial year or a custom range — names the comparison window on screen and carries a % delta on the revenue, expense and net cards; cash has no previous-period figure, so that card shows none. It also draws the 12-month trend, breaks the aging into every bucket with a proportional bar, stamps a last-updated time and lists what “Needs attention” (which adds pending approvals, from a second call rather than from the report endpoint).

Financial Overview takes a date range plus an as-of date and shows the same figures plainly: no comparison, no trend chart, no alerts, and receivables and payables as total, overdue and current rather than every bucket.

The financial figures on both screens need the Reports read permission, which the server enforces. Without it the Dashboard still renders its entity counts and recent activity and says plainly that the money is hidden.

Reports that aggregate the ledger read base-currency amounts. Every journal line stores its face amount and a base amount — face × the rate the journal was booked at — and the account-balance view sums the base columns, so a multi-currency tenant’s statements no longer add dollars to rupees. For a single-currency tenant base equals face and nothing changes.

A base-currency statement is only as good as the rate each journal was booked at. Three document paths resolve a rate and refuse to save without one; every other path books 1.0 when the request carries no rate, and a journal booked that way lands in these totals at face value — see Where the rate comes from.

Report Currency
Trial balance, P&L, balance sheet, cash flow Base
Dashboard, budget vs actual Base
AR / AP aging Base — each open balance × the rate its own document was booked at
General ledger, day book, expenses by category As booked on the transaction
Sales by item, sales by customer As booked on the document
Tax summary, GSTR-1, GSTR-3B, stock reports As booked on the transaction

The second group is deliberately un-converted — it is transaction detail, and a line reads best in the currency it was written in — but it does mean that for a multi-currency tenant those reports will not add up to the base-currency statements above.

The dashboard’s cash total is the one figure converted outside the ledger: each bank account’s balance is translated at the latest rate on file for the as-of date. An account whose currency has no rate on file is left at face value and flagged on screen rather than silently mis-summed.

  • Add ?format=csv to a report to download the exact rows the screen shows — same order, same numbers. CSV is available for ten of the eighteen reports: trial balance, P&L, balance sheet, general ledger, day book, AR aging, AP aging, sales by item, sales by customer and expenses by category. Cash flow, the dashboard, budget vs actual, the tax and GST returns and the stock reports have no CSV endpoint — they are screen and API only.
  • The P&L and balance-sheet CSVs gain their comparison columns when a comparison was requested. The aging CSV always carries the base bucket columns: its comparative figures are in the JSON response only.

Excel export on list pages is a separate thing from report CSV. The list screens — invoices, bills, expenses, journal entries, contacts, bank transactions, reconciliations, bank rules, the settings masters and the rest — share one standard table, and that table has an Excel (.xlsx) download built in, alongside column show/hide, reordering, resizing and density. It exports what you are looking at: the visible columns in their current order, as rendered, with a serial-number column, for the rows on the current page. To pull a whole ledger in one file, use the report CSV.