P&L report
Income statement by month / quarter / year, PDF + CSV export.
The Profit & Loss report is Kiravy's first financial-statement output. It produces an income statement for any client in the same three-column layout an LHDN-style P&L uses: revenue → COGS → gross profit → expenses → net profit.
Open from any client → Reports → P&L.
What it covers
- Revenue — every
account_type = 'revenue'line in the period - Cost of goods sold —
account_type = 'cogs' - Gross profit — derived (revenue − COGS)
- Expenses —
account_type = 'expense' - Net profit / loss — derived (gross profit − expenses)
Balance-sheet accounts (asset / liability / equity / tax) aren't shown here — the P&L only does the income statement. Those accounts already appear in the Trial balance report (which proves debits equal credits); a full Balance Sheet report is still to come.
Transactions with type = 'transfer' are excluded from the P&L. They aren't revenue or expense — just same-client cash movement.
Picking the period
Top of the page: a period selector with three granularities:
- Month —
2026-05 - Quarter —
2026-Q2 - Year —
2026
Defaults to the current month. Use the arrow buttons to step backward / forward, or type a token directly into the URL (?period=2026-Q1) for a shareable link.
Period-over-period comparison
If the prior period has data, Kiravy automatically shows two extra columns on screen:
- Previous — the same period one cycle ago
- Δ % — percentage change, colour-coded (green up, red down)
The deltas help spot anomalies at a glance — "why is rent up 80% from last month?"
Comparison columns are NOT included in exports (PDF / CSV) — they're a screen-only convenience. If you need them in a deliverable, take a screenshot or export both periods separately and join.
How amounts are computed
- The P&L is read straight from the journal (the ledger), not from the raw transaction list — see How Kiravy's general ledger works
- Because every entry posts SST to its own tax account, SST is never double-counted as revenue or expense — the P&L only ever sums the tax-exclusive (net) revenue and expense amounts
- Cancelled and voided entries are excluded (their reversals net them to zero)
- Soft-deleted transactions are excluded
The layout
Three columns, LHDN-style:
| Col 1 | Col 2 | Col 3 |
|---|---|---|
| Line item amount (account code + name) | Subtotal for the section | Net contribution to the section above |
So for Revenue, each account's amount lives in col 3, and the section's total lives in col 3 too. For COGS, line items go in col 1, subtotal in col 2, and the deduction (subtracted from revenue to get gross profit) shows in col 3. Same shape for Expenses.
Warnings the report surfaces
Two banner alerts appear at the top when relevant:
Unclassified transactions
Transactions in the period that don't have an account_code set. The report shows you a count and the total RM amount, with a link to Settings → Categorisation (or open an engagement) to fix them.
These are excluded from the P&L totals until categorised — so the numbers below the warning aren't lying, they're just incomplete by that amount.
Deductibility flags
A count of transactions flagged by tax deductibility as non-deductible or partial. These rows stay in the P&L totals (they're still expenses, just not deductible for tax). The warning links out to a filtered transaction view so you can review what'll be disallowed at year-end.
Exporting
Two formats, both via buttons at the top:
| Format | What you get |
|---|---|
| A4-sized rendered statement, suitable for client deliverables. Comparison columns dropped. | |
| CSV | One row per line item with columns Section / Code / Account / Amount. UTF-8 BOM included so Windows Excel opens cleanly. |
File names are auto-generated as pnl_[client-slug]_[period].pdf (or .csv).
PDF generation can take 20–30s on the first export after the server's been idle (cold start of the renderer). Subsequent exports in the same session are sub-second.
Drill-down
Currently none. Clicking a line in the P&L doesn't navigate to the transactions making it up. If you need to see the underlying entries for 500-200 Rent in May:
- Note the account code from the P&L
- Go to Transactions
- Filter by Account = 500-200 + Date range = May
A native drill-down link is on the roadmap.
Permissions
| Role | Can do |
|---|---|
| Partner / Manager | Everything — view, export, switch period |
| Staff | View + export for assigned clients |
| Viewer | View only — the export buttons are hidden |
What's coming
- Drill-down from line items into the transactions
- Balance Sheet report — assets / liabilities / equity (the Trial balance is live today)
- Cash flow statement
- Custom date ranges (today only month / quarter / year)
- Multi-client consolidation (for portfolio reporting)
What's next
- Tax deductibility — the layer that filters expenses for tax return purposes
- Transactions — the underlying data
- Chart of Accounts — how the grouping by section actually works