Ask AwraIQ about features, pricing, onboarding, login, integrations, security, demos, mobile apps, automation, reports, or support.
Your income statement in AWRA OpsHub is not typed up from anywhere. Revenue accounts on one side, five named groups of cost on the other, both read straight out of the postings your sales, stock, expenses and payroll already made — with the recognition rule written down instead of assumed.
Read from the general ledger · Explicit revenue recognition · Five named cost groups · Mirrored on the API
There is no clever inference here, and that is on purpose. Every account carries a system key, and the statement's revenue and expense sections are defined as lists of those keys — so you can point at any line and say precisely which accounts produced it.
Accounts are grouped by system key, not by matching words in their names. Rename "Operating Expenses" to "Overheads" and the line keeps working, because the statement follows the key rather than the label. That is also why a new account you create appears on the statement the moment you give it a grouped key — and stays off it if you do not.
The group exists and any posting to a depreciation account rolls into it. What we have not built yet is the thing that writes those postings — a schedule that walks your asset register monthly. So the line reads zero until something puts a figure there.
The statement labels its bottom line honestly. Where there is revenue it reads as a net income figure; where a workspace is recording cost before it records any sales, it reads as operational expenses instead of pretending a loss is a profit with a minus sign.
Most systems answer this question implicitly and leave you to reverse-engineer it from the numbers. AWRA answers it with a flag you control, on the reason codes you already use to describe why stock moved.
Every issue, check-out and adjustment carries a reason — sold, sample, damaged, internal transfer, written off. That reason is the business meaning of the movement, and you maintain the list yourself.
Each reason has a generates revenue switch. "Sold to customer" has it on. "Damaged in transit" does not. This is the whole recognition policy, expressed once, in the vocabulary your storekeepers already use rather than in an accounting setting nobody opens.
Check out an approved customer invoice and the platform reaches for a system reason called Approved customer invoice, creating it with the revenue flag already on if it does not exist. So the ordinary invoice-to-delivery path recognises revenue correctly on day one with nothing configured.
Where an invoice is behind the movement, the invoice is the authority on all three figures: the agreed total including any negotiated discount, and the tax split out. Receivables take the gross the customer owes, revenue is credited net, and tax lands in its own account. The item's list price never overrides what you actually billed.
Give something away for value against a revenue-flagged reason without raising an invoice, and there is no tax basis and no document to price against — so the fallback total is credited gross to revenue and receivables are debited, because something left for value and nobody has recorded payment for it.
The revenue flag is resolved by the reason's name rather than by an internal identifier. That makes the policy readable — you can see it in the reason list — but it also means renaming a revenue-generating reason needs the flag set again on the new name. If your reason list is settled, this never comes up; if you are still shaping it, set the flag last.
The value of naming them is that you can trace any figure back to the operation that produced it, without a drill-down and without asking anyone.
purchases Goods bought in. Filled by receiving against purchase orders and by stock check-ins.
expenses The buying cost of what left the shelf, posted by every point-of-sale sale and every invoiced issue at the moment it happens.
payroll_expenses Filled by posting an approved payroll run, and by project payouts — which deliberately use the same account so labour cost never disagrees with itself.
operating_expenses Rent, utilities, subscriptions, bank charges — the standalone spend recorded through expense management.
depreciation Reserved and grouped, ready for a depreciation schedule to post into. See the ledger below for what that involves.
Notice what is happening with cost of sales. In a business running on a spreadsheet, gross margin is a month-end calculation: total the sales, total the purchases, subtract, hope the stock count agrees. Here the cost of each sale is posted at the sale, out of the same item cost the inventory module uses. That means the cost side of your statement moves in step with the revenue side rather than lagging it by a stock take — which is the difference between knowing your margin and estimating it.
It also means a mistake shows up somewhere you will see it. If cost of sales looks impossibly small next to revenue, the item costs behind it are wrong, and that is a fixable data problem with a name. In the spreadsheet version, the same error is a slightly optimistic margin that nobody questions for a year.
A profit figure is the last place for a vague claim, so here is exactly what this statement is, and exactly what we would build onto it for you.
What AWRA OpsHub does today
More we can add to your workspace
Where we point you to a specialist
The first two items in the middle column are the ones customers ask for most, and both are scoped work on figures that already exist rather than new plumbing. Tell us which you need and we will come back with a written spec, a timeline and a price to add it to your workspace.
One thing to plan around rather than discover: this statement and the retained earnings figure on the balance sheet compute profit on different bases today — this one applies the revenue-recognition rule above, while retained earnings totals the revenue and expense accounts directly. Bringing both onto a single basis is on the list above and we will quote it.
The revenue is already recognised. The cost of sales is already posted. Payroll is already in. Your income statement is a page you open, not a task somebody owes you.