Ledgr/Documentation/Reports

Reports & analytics

Watch the lesson: Read your profit and loss and trial balance (2:03).

Financial, tax, management and compliance reports on one screen, plus a builder for the one nobody wrote — driven by the same period picker and exportable.

Plan.

Reports & analytics is included from Business upwards. The dashboard's own KPI row and cash-runway ring work on every plan, including Free.

Choosing a period

Every report uses the same picker: a month, a quarter, your financial year, or a custom range. Balance-sheet style reports ask for a single as at date instead of a range. The period you pick is stamped on the export, so a PDF sitting in someone's inbox still says what it covers.

The financial statements, and the ledger under them

ReportWhat it shows
Income statementRevenue, cost of sales, gross profit, operating expenses, other income, tax and net profit — presented on IFRS for SMEs lines
Balance sheetCurrent and non-current assets with accumulated depreciation, current and non-current liabilities, and equity, as at your chosen date
Cash flow statementDirect method, split into operating, investing and financing activities
Trial balanceEvery account with its opening balance, movement and closing balance, and whether debits equal credits
General ledgerFull transaction detail per account, with a running balance and the brought-forward figure
JournalsEvery posting Ledgr made and why, plus where you enter your own
Chart of accountsAdd, rename and retire the accounts you post to. It lives here rather than in Settings because it is ledger data, not a preference
Fixed asset registerAssets, SARS wear-and-tear rates, the depreciation run and disposals — see fixed assets
FX revaluationRestates open foreign-currency balances at a date you choose and posts the gain or loss, leaving the documents alone. Run it at each period end, or a foreign debtor is carried at whatever the rate was on the day you invoiced

Supplier bills sit in operating expenses, not in cost of sales, unless the category you posted them to says otherwise — so if gross margin looks wrong, check the category on the bills before you doubt the report.

Management reports

ReportWhat it shows
Departmental P&LThe income statement with a column per branch, department or project — see below
Cost centresWhere you set those branches, departments and projects up
Aged debtorsCurrent, 30, 60 and 90-plus buckets with a chart, and whether it agrees with the debtors control account
Aged creditorsThe same for what you owe, against the creditors control account
Budget vs actualPer category, with the variance in rands and as a percentage
Budget by accountThe same comparison at ledger-account level
Project profitabilityRevenue, cost and margin per job, drawing on time entries, parts and allocated purchases. It lives in Job Cards; the card on this screen takes you there. For a margin per branch, department or project across the whole ledger, use the departmental P&L
Break-even analysisWhat has to be sold to cover fixed costs at your current margin: revenue, variable and fixed costs, contribution margin, break-even revenue and margin of safety — see below
An ageing report that does not agree with the ledger says so.

Both ageing reports state whether they agree with their control account and by how much. A debtors ageing that quietly disagrees with the balance sheet is worse than no report at all, because every figure on it looks reasonable and somebody will act on one.

Break-even

A break-even point turns on one thing your ledger does not record: which costs move with sales and which stay put. So the report starts from a convention and shows you every account it counted, so you can correct it.

  • Cost of sales counts as variable and operating expenses as fixed until you say otherwise. Sales commission is an operating expense that is really variable; a production supervisor's salary is a cost of sale that is really fixed. Tap Fixed or Variable beside any account to change how it is counted, and Use default to go back. The choice is kept on the account, so every period you look at uses it.
  • It is read off the income statement for the period you pick, so its revenue, cost of sales and operating expenses are the statement's own, and it says so. Other income and tax are left out, because neither moves with sales.
  • Break-even revenue is fixed costs divided by the contribution margin ratio; the margin of safety is how far this period's revenue sits above it — or, when the period traded below break-even, how far short it fell.
  • With no revenue in the period, or variable costs as large as revenue, there is no break-even point, and the report says which of the two it is rather than printing a number.

One company, several branches

A business with depots in three cities usually does not want three sets of books — it wants one VAT return and three columns. That is what a cost centre is: a tag on the transaction, marked branch, department, project or other.

  1. Reports → Cost Centres, and add them

    Until you do, nothing anywhere asks you which branch a document is for. A single-location business never sees the field.

  2. Tag as you go

    The field appears on the invoice wizard, expense capture, the bill modal and the employee record, labelled with your own word for it. Unallocated is always offered, because a shared overhead genuinely belongs to no branch.

  3. Reports → Departmental P&L

    One column per cost centre, Unallocated, and the company total.

  • It says whether the columns add up. The total column is the real income statement, not the branch columns pushed together — and the report states explicitly whether they reconcile to it.
  • Everything posted before you started tagging sits in Unallocated, which is honest. Nothing is backfilled and no history is rewritten.
  • Payroll splits by employee, from the cost centre on their record, read live — so moving somebody between branches moves their cost from the next run onwards. Staff cost is usually the biggest line on a branch P&L, which is why this half matters most. PAYE, UIF and SDL stay pooled: they are filed as one company figure and splitting them would look like more detail while meaning nothing.
  • Trial balance and general ledger take the same filter, including the brought-forward balance — so a branch's running balances are that branch's, not the company's.
Branches are not separate companies.

Cost centres are for one legal entity with several places. If each one has its own VAT number and its own books, that is multi-company instead. Splitting one business across two entities means filing one VAT201 from two sets of books, which is a much bigger problem than a missing column.

Tax reports

  • VAT analysis — input against output VAT, broken down, and reconciled against the VAT control accounts. This is the report to read before you generate a VAT201
  • PAYE summary — the monthly employer tax position behind the EMP201. The card opens SARS Returns, where the EMP201 for each month is prepared from the payroll runs
  • Provisional tax estimate — an IRP6 built from your year-to-date figures. The card opens SARS Returns, where the IRP6 is prepared
  • Annual tax pack — the year-end bundle a practitioner asks for, in one download

The annual tax pack

Pick the financial year and download one zip holding what that year produced: the trial balance, income statement and balance sheet, the fixed-asset register, the year's VAT201s, the EMP201s and the EMP501 reconciliation where you run payroll, and the ITR14 working with its supporting trial balance. Every file is the same output the report or return produces on its own screen.

  • Nothing is left out quietly. The screen lists what the pack holds and what it does not, and a README inside the zip says the same: a return your plan does not include, one your role cannot read, a VAT or payroll period that has not ended, or a company that is not a VAT vendor or has no employees.
  • A return that does not pass SARS's own checks stays out — a missing reference number, a period that does not balance — and the README names the reason, exactly as SARS Returns refuses to download it.
  • Ledgr prepares these files; it does not submit them. Capture or upload each return on eFiling or e@syFile, or hand the pack to your tax practitioner.

Compliance reports

  • Annual financial statements — statutory year-end statements with notes and comparatives
  • Period close — lock a month so its figures stay put. Closing is what stops a correction landing in a period you have already reported on
  • Accountant access — who can see your books, the invitations addressed to you, and the queries between you and your accountant. It is a tab in Settings rather than a report on this screen. The accountant's own client console is a separate screen on their side; see running a practice
  • B-BBEE scorecard — all six elements with your points against each and the resulting level, drawing on the procurement and payroll data already captured. Use it to see where a level is slipping before the verification appointment, not after

Custom report builder

  1. Reports → Custom Builder → New report
  2. Choose how to group it

    Tap a period — month, calendar quarter, calendar year or the whole period — then up to three of account, statement section, customer or supplier, cost centre and, on a plan with Multi-company, company. Columns are chosen by tapping, not dragging.

  3. Choose the figures

    Revenue, cost of sales, gross profit, gross margin, operating expenses, other income, tax and net profit.

  4. Filter it if you need to

    To particular statement sections, or to one cost centre.

  5. Run it, then save it

    Run reads the report off your books for the period on the bar. Save it and it joins your saved reports; opening one re-runs it against your books as they stand, not a copy of an old answer.

Every row is the income statement for its slice of the ledger, so a report with no filter totals to exactly the income statement for the same period — and it says whether its rows add up to those totals. A customer's figures come from the invoices and credit notes raised to them; a posting with no customer or supplier is shown as its own row rather than dropped. Export CSV takes the table as it is on screen.

Exporting

The statements and the management reports export to PDF, Excel or CSV. PDF for sending to a bank or a funder, Excel when someone is going to pivot it, CSV when it is feeding another system. A custom report exports as CSV, and the annual tax pack downloads as a zip.

Scheduled reports

Set a frequency, a format and a list of recipients, and the report is generated and sent without anyone remembering to do it. The report arrives in the email body and as an attachment in the format you chose — PDF to read and file, CSV to open in a spreadsheet. Schedules can be paused and resumed — useful for a monthly pack that should not go out mid-audit.

Each schedule shows when it last ran and what happened: who it was sent to, or why it was not sent.

Before you send a pack out

Reconcile the bank, approve any payroll run still in draft and clear the expense approval queue. Those three are what usually make last month's numbers move after someone has already seen them.

Live figures in Excel

Exporting to Excel gives you a snapshot. If you have built a model on top of Ledgr's numbers, what you want is for the model to fetch fresh ones — without anyone re-exporting and re-pasting, which is where a monthly pack goes wrong.

Each report is available as a flat table at a URL, which Excel's Power Query can refresh on demand or on open:

Power Query — paste into Data → Get Data → Blank Query → Advanced Editor
let
    // Roles & Users → API Keys, scope reports:read
    Key = "ledgr_…",
    Url = "https://www.ledgrsa.com/api/report-tables/trial-balance",
    Source = Json.Document(
        Web.Contents(Url, [Headers = [Authorization = "Bearer " & Key]])
    ),
    Table = Table.FromRecords(Source)
in
    Table

Swap trial-balance for general-ledger, income-statement, balance-sheet, aged-debtors, aged-creditors, vat-analysis, budget-vs-actual, stock-valuation or stock-aging. Add ?from=2026-03-01&to=2027-02-28 to pin a period, or leave it off for the current financial year. The stock valuation is taken as at the to date. GET /api/report-tables lists them all.

If you would rather not write any M at all, append ?format=csv and use Data → From Web. Every cell is quoted, so an account name containing a comma cannot split into two columns.

The key is the credential here, not a token.

Everywhere else in the API an integration trades its key for a short-lived token. Excel cannot do that — Power Query fetches a URL, it does not run a login — and a workbook that refreshes monthly cannot hold a token that expires hourly. So this one route accepts the key itself, and is narrowed to match: read-only, reports only, and it refuses a key without the reports:read scope. Give the workbook a key of its own so it can be revoked without disturbing anything else, and remember that a key pasted into a shared workbook is readable by everyone who opens it.

This is not a report designer, and it deliberately does not try to be one — the layout, the pivots and the formatting stay yours, in your workbook, where you already know how they work. Ledgr's job is to keep the numbers underneath them current.

Common problems

What you seeWhat to do
"Invalid date … — expected yyyy-MM-dd" A malformed date is refused, never defaulted. Answering a different period from the one asked for is how a figure gets reconciled against the wrong month, so every report on this screen would rather fail than substitute.
"A report period has to start before it ends" The two dates are the wrong way round; both are printed in the message.
The income statement and the balance sheet disagree Check the period. Both default to the financial year to date. The dashboard's own tile is labelled "trailing 12 months" and is a different question.
Aged debtors will not agree with a past month's balance sheet Pass the date. The ageing re-derives the position at that date — payments after it are reversed out — and checks against the control account at the same date, so the two agree to the cent.
The control difference on an aged report is not zero That figure is doing its job: it is the gap between the age analysis and the control account in the ledger, and it is the one place a posting problem surfaces. Read it as a real difference to investigate rather than a display fault.
A departmental column does not add up to the total The report says so explicitly rather than leaving you to add a row of figures. The tolerance scales with the number of columns, because each column's profit rounds to cents independently — so a rand out is a real break and a few cents is not.
Everything is in "Unallocated" Cost centres are optional, and nothing posted before you created your first one carries the dimension. Nothing is backfilled, which is the honest answer: tag new documents and the columns fill from there.
The report shows no cost-centre columns at all The empty state distinguishes two different situations — no cost centres exist (a setup task) versus cost centres exist and nothing is tagged (a data-entry one) — so read which one it says.
"costCentreId must be a UUID or the word …" An unparseable filter is refused rather than widened to the whole company. A filtered report that quietly answers with everything is the worst outcome, because every figure on it is real and all of them are wrong for the question asked.
"Your company details are not set up yet" Open Settings → Company, fill in your business details and save — that creates it.
"This company is not part of a group structure" Consolidated reports need a parent and at least one subsidiary. See Multi-company.
Turnover reads nil on the ITR14 Almost always an imported chart of accounts using a different word for income. Ledgr recognises the common alternative names; if a figure is still missing, check the account's type on the chart of accounts rather than its name.
A scheduled report never arrives Open Scheduled Reports and read the schedule's last run — it says whether the report was sent, and if not, why. If it says it was sent, check the spam folder, then contact support.