Skip to content
Knowledge ERP Docs

API Reference ↗
Reporting

Reporting & Dashboards

A configurable home dashboard plus a library of cross-module reports — with saved filter presets, CSV export, and scheduled email delivery.

Knowledge ERP ships a library of operational and financial reports, a customizable home dashboard, and the plumbing to filter, export, and schedule them.

The home dashboard #

The main dashboard is configurable: choose which widgets appear from the widget library, and your layout is remembered per user. It's the at-a-glance view of the numbers you care about most.

You will only be offered the widgets whose data you are allowed to see. The dashboard itself is always reachable — a widget you lack the permission for is simply not there, and does not appear in the Customize list.

Section dashboards #

Several modules have a dashboard of their own — Sales, Purchasing, Manufacturing and Appointments — and each one is the first item in its section of the sidebar, so the section opens on its numbers rather than on a list. The main dashboard stays at the top of the sidebar as before.

The report library #

Pre-built reports and dashboards span every module, including:

  • Inventory — valuation, low stock
  • Sales — sales dashboard, sales summary, top customers, quote pipeline, sales pipeline, sales forecast, and gross margin by product (see The Gross Margin report)
  • Receivables / payables — invoice aging, AP aging, cash flow
  • Purchasing — purchasing dashboard, vendor performance
  • Manufacturing — manufacturing dashboard, work-in-progress (WIP)
  • Appointments and Feedback surveys — operational dashboards and survey results

The valuation report #

Inventory → Movement Log → Valuation Report values your stock product by product: how many units, how much that adds up to, the unit cost, and the cost and retail value of the lot. It exports to CSV.

It values stock wherever it is, not only what is on the shelf. A unit that is Checked Out — including one out on loan or rent — or On Hold, or In Transit on a transfer, is still an asset of the business, so it is valued here. That is why the column says Quantity Valued rather than naming a shelf, and why these figures can read higher than a stock count of what is physically in your bins. The page says as much above the table.

What the columns add up:

  • Missing units are left out altogether. Stock nobody can find is a realised loss, and carrying it as an asset in an unknown place is how shrinkage stays invisible.
  • Every other unit is included, at the quantity its own record says is left. Quantity Valued adds those quantities up. Cost Value and Retail Value are what the same units come to in money, worked out unit by unit, so they need not equal Quantity Valued times the Unit Cost beside them. The total above the table says Units Valued because that is what it counts: the unit records these figures were worked out over.

A unit shipped on a sales order is left at 0% full, so it adds nothing here — the same as a unit written off with Discard or Donate. Shipping has not always done this: a unit shipped before it did still holds the quantity it had, and is still valued here.

So the report is as right as the unit records behind it. If a figure looks too high, open the product's units and open one: a unit whose % Full still says 100% is valued as a full one, and being marked Out of Stock does not change that.

Like the other reports, it is narrowed to the locations you are allowed to see, so two people can read different totals on the same day and both be right.

The aging reports #

Invoice Aging (money in) and AP Aging (money out) are the same report pointed at opposite ledgers, and both are drawn up as at a date.

That date is the whole point of them. A debtors figure you cannot produce a second time is a figure nobody can close a month on, so "as at 31 August" means what it means in a ledger:

  • balances are aged against that date, not against today;
  • a document raised after it is not on the report;
  • money collected after it has not been collected yet. An invoice settled in September was still owing on the 31st of August, and the August report keeps saying so however many times you run it.

Each report shows the bucket totals, a Summary by Customer (or by Vendor) — one row per party with a column per bucket, which is the sheet to hand somebody — and then the documents themselves, bucket by bucket. Every money figure is shown to the cent.

Save Filter / Load Filter keep an as-at date, and Export CSV takes the whole thing to a spreadsheet. The AP Aging export ends with two columns, each bill's Currency and what is Outstanding on it in your home currency.

The single-customer version of this is the Statement on the customer's own page, which ages the same way and can be emailed, printed or saved as a PDF. See Customers.

The Cash Flow report #

Cash Flow shows what came in from customers and what went out to vendors, month by month, over the range you pick.

Money in and money out are both counted on the payment's date, not the date of the invoice or bill it settles — so a payment posted against an older invoice lands in the month it was actually received, not the month the invoice was raised.

A reversed payment reduces the month it was reversed in, not the month it was originally recorded in. Reversing a payment writes a second, negative-amount entry on the day of the reversal (see Customer Invoices), so a payment received in March and reversed in April lowers April's total, not March's. March still shows the money as received, because on the 31st of March it was.

The Gross Margin report #

Reports → Gross Margin shows, product by product, what the goods that left on sales cost against what they sold for, over the dates you pick: Revenue, Cost of Goods Sold, Gross Margin and Margin %, with a total and a CSV export.

On an account on Basic inventory, the report is hidden unless the account has Purchasing.

The cost and the price are the ones recorded at the moment each unit left: the unit's own cost (for stock received on a purchase order, that includes its landed cost), or its product's when the unit has none (times the part of the unit that was still there), and the price on the order line. Changing a cost or a price afterwards does not change what this report says about a sale that has already happened. A customer return takes back what it recorded: the price in proportion to how much came back, and the cost in the same proportion up to one unit's worth. Sales and returns count on the day they were recorded, on your account's clock.

Margin only compares sales that recorded a cost. A sale with no cost recorded is listed apart, as "cost not recorded" with its count and revenue, and is left out of Revenue, Cost of Goods Sold and Margin, so unknown costs are never counted as free. Returns of such sales are shown apart too, and are not taken off that revenue. The Units Shipped (All) column counts every sale, with or without a cost, so it can be higher than the units behind Revenue. That includes every sale shipped before this report existed: those were never costed, and no cost is filled in for them afterwards. The components of a kit are shown as cost only, since a kit is priced as a whole.

The report needs the sales orders and units permissions, and both the Sales and Inventory modules. Where your role covers only some Locations, it shows a sale or return only if you may view units at its Location and may also view the sales order it belongs to. A sale that can't be tied to an order is left out for you when it is your view of sales orders that is limited to some Locations.

Who can see a report #

A report is gated by the view_any permission for every kind of data it shows, not just one of them — Cash Flow needs both customer and vendor payment permissions, because it puts money in and money out on the same screen. Without them the report is absent from the navigation and refuses if you go to its URL directly. Module access is checked as well: the permissions alone will not open a report belonging to a module your plan does not include.

The full report-by-report list is in Users, Roles & Permissions.

Filters #

The filter bar at the top of a report applies as soon as you change it — there is no Apply button to press. Change a date, pick a person, and the figures below redraw against the new range.

When a filter leaves a report with nothing to show, the empty message names the filter it applied, so an idle week and a broken report cannot be mistaken for one another.

Which day a record counts on #

A report's dates are your account's. Its default range is counted from today in your account's time zone, set in Account Settings, and so are a scheduled report's relative dates, such as this month.

Each record is then counted on its own day:

  • Quotes and work orders count on the day they happened at their Location (a work order's is its Output Location), when that Location has its own time zone. Those at a Location without one, or at none, count on your account's day.
  • Dates with no time of day, such as invoice, payment, order and expected close dates, count on the date they carry.
  • Surveys (responses and invitations) count on the day at the Location of the record the survey was sent about, such as a sales order, appointment, rental or loan, when that Location has its own time zone. Moving that record to another Location later does not move the survey. A survey sent about no such record, such as one answered from the open link, counts on your account's day, and so does every survey sent before this was introduced.
  • Inventory movements count on your account's day. A movement has two Locations, the one it left and the one it reached, so it keeps your account's.

So when your Locations are in different time zones, a report's totals are not all on one calendar. With your account in Denver and a Location in Sydney, a quote created at 1:00 AM on September 2 in Sydney counts on September 2, though it was still September 1 in Denver. A report ending on September 28 leaves out a Sydney quote from early on the 29th there, even while it is still the 28th in Denver.

One filter is not read this way yet: the report builder's Submitted on Survey Answers, which is compared with the time stored in UTC (see Building a report).

Saved filters #

Reports that support filtering let you save filter presets — name a set of filters once (a location, a date range, a status) and reapply it in a click, instead of re-entering the same parameters every time.

CSV export #

Every tabular report can be exported to CSV, so you can pull the underlying numbers into a spreadsheet or hand them to another system. Visual dashboards (Sales, Purchasing, Manufacturing, Appointments) display charts and summaries without a CSV export option.

Exported files are written to be added up, not read. Money and quantities leave as plain numbers — no currency symbol and no thousands separator — so a column of them totals correctly instead of a spreadsheet treating 1,990.36 as text and silently dropping it from a SUM(). Dates leave in YYYY-MM-DD form, which sorts as a date rather than alphabetically, except from the report builder, which writes them as the screen shows them (Sep 2, 2026). A time in a report's file names its time zone. A value that starts with =, +, -, @, a tab or a carriage return, other than a plain number, is written with a leading apostrophe, so a spreadsheet shows it as text instead of running it as a formula. The screen keeps its readable formatting; only the file is changed. A report builder report delivered on a schedule arrives written the same way as its download, except that a time not tied to a Location is in your account's time zone.

Scheduled delivery #

Set up a report schedule to have a report emailed to recipients on a cadence (for example, a weekly low-stock report or a monthly aging report). A background command (reports:deliver-scheduled) sends them automatically. The send time is in your account's time zone. Reports → Scheduled Reports lists only the reports your role lets you open.

A scheduled report is generated with the permissions of the person who set it up, whoever it is sent to. If they can no longer open the report, or can no longer sign in, it is not sent: the schedule shows Failed with the reason, and it is sent again at its next scheduled time once they can.

Building your own reports #

The reports above are pre-built. To define your own reports and KPIs without code, use the Report Builder. For a cut neither covers, the REST API lets you pull the raw data and build it yourself.